soiz1's picture
Upload folder using huggingface_hub
8f3f8db verified
inlining
exitVar: exitVar label: exitLabel
"Replace each return statement in this method with an assignment to the exit variable followed by a goto to the given label. Return true 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."
| newStmts labelUsed |
labelUsed := false.
parseTree nodesDo: [ :node |
node isStmtList ifTrue: [
newStmts := OrderedCollection new: 100.
node statements do: [ :stmt |
(stmt isReturn) ifTrue: [
exitVar = nil ifTrue: [
stmt expression isLeaf ifFalse: [
"evaluate return expression even though value isn't used"
newStmts add: stmt expression.
].
] ifFalse: [
"assign return expression to exit variable"
newStmts add:
(TAssignmentNode new
setVariable: (TVariableNode new setName: exitVar)
expression: stmt expression).
].
(stmt == parseTree statements last) ifFalse: [
"generate a goto (this return is NOT the last statement in the method)"
newStmts add: (TGoToNode new setLabel: exitLabel).
labelUsed := true.
].
] ifFalse: [
newStmts addLast: stmt.
].
].
node setStatements: newStmts asArray.
].
].
^labelUsed