Avoid using (obsolete) PPCMethod>>addVariable:, use allocateTemporaryVariableNamed: instead.
--- a/compiler/PPCCodeGenerator.st Sat May 02 07:03:07 2015 +0200
+++ b/compiler/PPCCodeGenerator.st Tue May 05 15:07:19 2015 +0200
@@ -167,15 +167,16 @@
!PPCCodeGenerator methodsFor:'visiting'!
visitActionNode: node
- compiler addConstant: node block as: (compiler idFor: node).
-
- compiler addVariable: 'element'.
- compiler add: 'element := '.
- compiler callOnLine: (self visit: node child).
- compiler add: 'error ifFalse: [ ^ ', (compiler idFor: node), ' value: element ].'.
- compiler add: '^ failure'.
+ | elementVar |
- "Modified: / 23-04-2015 / 15:59:00 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+ compiler addConstant: node block as: (compiler idFor: node).
+ elementVar := compiler allocateTemporaryVariableNamed:'element'.
+ compiler add: elementVar,' := '.
+ compiler callOnLine: (self visit: node child).
+ compiler add: 'error ifFalse: [ ^ ', (compiler idFor: node), ' value: ',elementVar,' ].'.
+ compiler add: '^ failure'.
+
+ "Modified: / 05-05-2015 / 14:39:52 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
visitAndNode: node
@@ -251,45 +252,45 @@
!
visitChoiceNode: node
- | firsts guard whitespaceConsumed |
+ | firsts guard whitespaceConsumed elementVar |
- whitespaceConsumed := false.
- firsts := (node firstSetSuchThat: [ :e | (e isKindOf: PPCTrimmingTokenNode) or: [ e isTerminal ] ]).
+ whitespaceConsumed := false.
+ firsts := (node firstSetSuchThat: [ :e | (e isKindOf: PPCTrimmingTokenNode) or: [ e isTerminal ] ]).
- compiler addVariable: 'element'.
- "If we start with trimming token, we should invoke the whitespace parser"
- (firsts allSatisfy: [ :e | e isKindOf: PPCTrimmingTokenNode ]) ifTrue: [
- self compileTokenWhitespace: firsts anyOne.
- whitespaceConsumed := true.
- ].
+ elementVar := compiler allocateTemporaryVariableNamed: 'element'.
+ "If we start with trimming token, we should invoke the whitespace parser"
+ (firsts allSatisfy: [ :e | e isKindOf: PPCTrimmingTokenNode ]) ifTrue: [
+ self compileTokenWhitespace: firsts anyOne.
+ whitespaceConsumed := true.
+ ].
- 1 to: node children size do: [ :idx | |child allowGuard |
- child := node children at: idx.
+ 1 to: node children size do: [ :idx | |child allowGuard |
+ child := node children at: idx.
" allowGuard := ((child isKindOf: PPCTrimmingTokenNode) and: [ whitespaceConsumed not ]) not.
"
- allowGuard := whitespaceConsumed.
+ allowGuard := whitespaceConsumed.
- (allowGuard and: [arguments guards and: [ (guard := PPCGuard on: child) makesSense ]]) ifTrue: [
- guard id: (compiler idFor: guard prefixed: #guard).
- guard compileGuard: compiler.
- compiler add: ' ifTrue: [ '.
- compiler indent.
- compiler add: 'self clearError.'.
- compiler codeStoreValueOf: [self visit: child] intoVariable: 'element'.
- compiler add: 'error ifFalse: [ ^ element ].'.
- compiler dedent.
- compiler add: ' ].'.
- ] ifFalse: [
- compiler add: 'self clearError.'.
- compiler codeStoreValueOf: [self visit: child] intoVariable: 'element'.
- compiler add: 'error ifFalse: [ ^ element ].'.
- ]
- ].
- compiler add: '^ self error: ''no choice suitable'''.
+ (allowGuard and: [arguments guards and: [ (guard := PPCGuard on: child) makesSense ]]) ifTrue: [
+ guard id: (compiler idFor: guard prefixed: #guard).
+ guard compileGuard: compiler.
+ compiler add: ' ifTrue: [ '.
+ compiler indent.
+ compiler add: 'self clearError.'.
+ compiler codeStoreValueOf: [self visit: child] intoVariable: elementVar.
+ compiler add: 'error ifFalse: [ ^ ',elementVar,' ].'.
+ compiler dedent.
+ compiler add: ' ].'.
+ ] ifFalse: [
+ compiler add: 'self clearError.'.
+ compiler codeStoreValueOf: [self visit: child] intoVariable: elementVar.
+ compiler add: 'error ifFalse: [ ^ ',elementVar,' ].'.
+ ]
+ ].
+ compiler add: '^ self error: ''no choice suitable'''.
- "Modified: / 23-04-2015 / 21:40:23 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+ "Modified: / 05-05-2015 / 14:10:01 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
visitEndOfFileNode: node
@@ -372,15 +373,17 @@
!
visitNotNode: node
-
+ | mementoVar |
- compiler addVariable: 'memento'.
- compiler add: (compiler smartRemember: node child).
-
- compiler call: (self visit: node child).
- compiler add: (compiler smartRestore: node child).
+ mementoVar := compiler allocateTemporaryVariableNamed: 'memento'.
+ compiler add: (compiler smartRemember: node child to: mementoVar ).
+
+ compiler call: (self visit: node child).
+ compiler add: (compiler smartRestore: node child from: mementoVar ).
- compiler add: '^ error ifFalse: [ self error ] ifTrue: [ self clearError. nil ]'.
+ compiler add: '^ error ifFalse: [ self error ] ifTrue: [ self clearError. nil ]'.
+
+ "Modified: / 05-05-2015 / 14:29:52 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
visitOptionalNode: node
@@ -467,13 +470,16 @@
!
visitStarAnyNode: node
+ | retvalVar sizeVar |
- compiler addVariable: 'retval size'.
- compiler add: 'size := context size - context position.'.
- compiler add: 'retval := Array new: size.'.
- compiler add: '(1 to: size) do: [ :e | retval at: e put: context next ].'.
- compiler add: '^ retval'.
-
+ retvalVar := compiler allocateReturnVariable.
+ sizeVar := compiler allocateTemporaryVariableNamed: 'size'.
+ compiler add: sizeVar , ' := context size - context position.'.
+ compiler add: retvalVar,' := Array new: ',sizeVar,'.'.
+ compiler add: '(1 to: ',sizeVar,') do: [ :e | ',retvalVar,' at: e put: context next ].'.
+ compiler codeReturn.
+
+ "Modified: / 05-05-2015 / 14:13:52 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
visitStarCharSetPredicateNode: node
@@ -564,21 +570,23 @@
!
visitTokenSequenceNode: node
-
-
- compiler addVariable: 'memento'.
- compiler add: (compiler smartRemember: node).
-
-" self addGuard: compiler."
+ | mementoVar |
- compiler codeStoreValueOf: [ self visit: (node children at: 1) ] intoVariable: #whatever.
- compiler add: 'error ifTrue: [ ^ failure ].'.
+ mementoVar := compiler allocateTemporaryVariableNamed: 'memento'.
+ compiler add: (compiler smartRemember: node to: mementoVar).
+ "
+ self addGuard: compiler.
+ "
+ compiler codeStoreValueOf: [ self visit: (node children at: 1) ] intoVariable: #whatever.
+ compiler add: 'error ifTrue: [ ^ failure ].'.
- 2 to: (node children size) do: [ :idx | |child|
- child := node children at: idx.
- compiler codeStoreValueOf: [ self visit: child ] intoVariable: #whatever.
- compiler add: 'error ifTrue: [ ', (compiler smartRestore: node) ,' ^ failure ].'.
- ].
+ 2 to: (node children size) do: [ :idx | |child|
+ child := node children at: idx.
+ compiler codeStoreValueOf: [ self visit: child ] intoVariable: #whatever.
+ compiler add: 'error ifTrue: [ ', (compiler smartRestore: node from: mementoVar) ,' ^ failure ].'.
+ ].
+
+ "Modified (comment): / 05-05-2015 / 14:31:57 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
visitTokenStarMessagePredicateNode: node