Spaces:
Running
Running
| inlining support | |
| extractInlineDirective | |
| "Scan the top-level statements for an inlining directive of the form: | |
| self inline: <boolean> | |
| and remove the directive from the method body. Return the argument of the directive or #dontCare if there is no inlining directive." | |
| | result newStatements methodDirectiveFound | | |
| sharedCase ifNotNil:[^false]. "don't auto-inline shared code; it gets handled specially" | |
| result := #dontCare. | |
| methodDirectiveFound := false. | |
| newStatements := OrderedCollection new: parseTree statements size. | |
| parseTree statements do: [ :stmt | | |
| (stmt isSend and: [stmt selector = #inline:]) ifTrue: [ | |
| methodDirectiveFound := true. | |
| result := stmt args first value = true. | |
| ] ifFalse: [ | |
| newStatements add: stmt. | |
| ]. | |
| ]. | |
| parseTree setStatements: newStatements asArray. | |
| methodDirectiveFound ifTrue: [^ result]. | |
| "no method declaration was used, so check for a pragma declaration" | |
| sharedCase ifNotNil: [^false]. "don't auto-inline shared code; it gets handled specially" | |
| ^self | |
| extractDirective: #inline: | |
| valueBlock: [:sendNode| sendNode args first value = true] | |
| default: #dontCare |