# HG changeset patch # User Jan Vrany # Date 1430831239 -7200 # Node ID c1b26806ee0bd0947b955d8d664fa11e07259119 # Parent 02db0b67ed3f99924f71422ec4c8b8909a296a52 Avoid using (obsolete) PPCMethod>>addVariable:, use allocateTemporaryVariableNamed: instead. diff -r 02db0b67ed3f -r c1b26806ee0b compiler/PPCCodeGenerator.st --- 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 " + 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 " ! 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 " + "Modified: / 05-05-2015 / 14:10:01 / Jan Vrany " ! 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 " ! 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 " ! 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 " ! visitTokenStarMessagePredicateNode: node