[Vm-dev] VM Maker: VMMaker.oscog-eem.1854.mcz
commits at source.squeak.org
commits at source.squeak.org
Sat Apr 30 20:16:30 UTC 2016
Eliot Miranda uploaded a new version of VMMaker to project VM Maker:
http://source.squeak.org/VMMaker/VMMaker.oscog-eem.1854.mcz
==================== Summary ====================
Name: VMMaker.oscog-eem.1854
Author: eem
Time: 30 April 2016, 1:13:30.569533 pm
UUID: 69822805-79e9-43ee-a302-00e3536dc4fe
Ancestors: VMMaker.oscog-nice.1853
Delete a broken assert. Rename a misnamed method.
=============== Diff against VMMaker.oscog-nice.1853 ===============
Item was changed:
----- Method: TMethod>>exitVar:label: (in category 'inlining') -----
exitVar: exitVar label: exitLabel
"Replace each return statement in this method with an assignment to the
exit variable followed by either a return or a goto to the given label.
Answer if a goto was generated."
"Optimization: If exitVar is nil, the return value of the inlined method is not being used, so don't add the assignment statement."
| labelUsed map elisions eliminateReturnSelfs |
labelUsed := false.
map := Dictionary new.
elisions := Set new.
"Conceivably one might ^self from a struct class and mean it. In most cases though
^self means `get me outta here, fast'. So unless this method is from a VMStruct class,
elide any ^self's"
eliminateReturnSelfs := ((definingClass inheritsFrom: VMClass) and: [definingClass isStructClass]) not
and: [returnType = #void or: [returnType = #sqInt]].
parseTree nodesDo:
[:node | | replacement |
node isReturn ifTrue:
[self transformReturnSubExpression: node
toAssignmentOf: exitVar
andGoto: exitLabel
unless: eliminateReturnSelfs
into: [:rep :labelWasUsed|
replacement := rep.
labelWasUsed ifTrue: [labelUsed := true]].
"replaceNodesIn: is strictly top-down, so any replacement for ^expr ifTrue: [...^fu...] ifFalse: [...^bar...]
will prevent replacement of either ^fu or ^bar. The corollary is that ^expr ifTrue: [foo] ifFalse: [^bar]
must be transformed into expr ifTrue: [^foo] ifFalse: [^bar]"
(node expression isConditionalSend
and: [node expression hasExplicitReturn])
ifTrue:
[elisions add: node.
(node expression args reject: [:arg| arg endsWithReturn]) do:
[:nodeNeedingReturn|
self transformReturnSubExpression: nodeNeedingReturn statements last
toAssignmentOf: exitVar
andGoto: exitLabel
unless: eliminateReturnSelfs
into: [:rep :labelWasUsed|
replacement := rep.
labelWasUsed ifTrue: [labelUsed := true]].
map
at: nodeNeedingReturn statements last
put: replacement]]
ifFalse:
[map
at: node
put: (replacement ifNil:
[TLabeledCommentNode new setComment: 'return ', node expression printString])]]].
map isEmpty ifTrue:
[self deny: labelUsed.
^false].
"Now do a top-down replacement for all returns that should be mapped to assignments and gotos"
parseTree replaceNodesIn: map.
"Now it is safe to eliminate the returning ifs..."
elisions isEmpty ifFalse:
[| elisionMap |
elisionMap := Dictionary new.
elisions do: [:returnNode| elisionMap at: returnNode put: returnNode expression].
parseTree replaceNodesIn: elisionMap].
- "Afterwards all returns should be gone."
- self deny: parseTree hasExplicitReturn.
"Now flatten any new statement lists..."
parseTree nodesDo:
[:node| | list |
(node isStmtList
and: [node statements notEmpty
and: [node statements last isStmtList]]) ifTrue:
[list := node statements last statements.
node statements removeLast; addAllLast: list]].
^labelUsed!
Item was changed:
----- Method: TParseNode>>collect: (in category 'enumerating') -----
collect: aBlock
| nodes |
+ self halt. "This is a misnomer; should be deleted"
nodes := OrderedCollection new.
self nodesDo: [:n| (aBlock value: n) ifTrue: [nodes add: n]].
^nodes!
Item was added:
+ ----- Method: TParseNode>>select: (in category 'enumerating') -----
+ select: aBlock
+ | nodes |
+ nodes := OrderedCollection new.
+ self nodesDo: [:n| (aBlock value: n) ifTrue: [nodes add: n]].
+ ^nodes!
More information about the Vm-dev
mailing list