--- a/AssignNd.st Fri Mar 01 01:00:17 1996 +0100
+++ b/AssignNd.st Fri Mar 01 01:00:46 1996 +0100
@@ -11,10 +11,10 @@
"
ParseNode subclass:#AssignmentNode
- instanceVariableNames:'variable expression'
- classVariableNames:''
- poolDictionaries:''
- category:'System-Compiler-Support'
+ instanceVariableNames:'variable expression'
+ classVariableNames:''
+ poolDictionaries:''
+ category:'System-Compiler-Support'
!
!AssignmentNode class methodsFor:'documentation'!
@@ -59,50 +59,76 @@
!AssignmentNode methodsFor:'code generation'!
checkIncDecOn:aStream
+ "check if we can use incMvar / decMvar instruction.
+ If so, code it and return true.
+ Otherwise, return false."
+
|sel erec arg code|
(variable type == #MethodVariable) ifTrue:[
- expression isBinaryMessage ifTrue:[
- sel := expression selector.
- erec := expression receiver.
- ((sel == #+) or:[sel == #-]) ifTrue:[
- (erec type == #MethodVariable) ifTrue:[
- (erec index == variable index) ifTrue:[
- arg := expression arg1.
- arg isConstant ifTrue:[
- (arg value == 1) ifTrue:[
- (sel == #+) ifTrue:[
- code := #incMethodVar
- ] ifFalse:[
- code := #decMethodVar
- ].
- aStream nextPut:code; nextPut:(expression lineNumber); nextPut:(variable index).
- ^ true
- ]
- ]
- ]
- ]
- ]
- ]
+ expression isBinaryMessage ifTrue:[
+ sel := expression selector.
+ erec := expression receiver.
+
+ ((sel == #+) or:[sel == #-]) ifTrue:[
+ (erec type == #MethodVariable) ifTrue:[
+ (erec index == variable index) ifTrue:[
+ arg := expression arg1.
+ arg isConstant ifTrue:[
+ (arg value == 1) ifTrue:[
+ (sel == #+) ifTrue:[
+ code := #incMethodVar
+ ] ifFalse:[
+ code := #decMethodVar
+ ].
+ aStream nextPut:code; nextPut:(expression lineNumber); nextPut:(variable index).
+ ^ true
+ ]
+ ]
+ ]
+ ]
+ ]
+ ]
].
^ false
+
+ "Modified: 1.3.1996 / 00:08:02 / cg"
!
codeForSideEffectOn:aStream inBlock:b for:aCompiler
(self checkIncDecOn:aStream) ifTrue:[^ self].
- expression codeOn:aStream inBlock:b for:aCompiler.
- variable codeStoreOn:aStream inBlock:b valueNeeded:false for:aCompiler
+
+ self codeNormalOn:aStream valueNeeded:false inBlock:b for:aCompiler
"Modified: 4.9.1995 / 14:38:10 / claus"
+ "Modified: 1.3.1996 / 00:42:10 / cg"
+!
+
+codeNormalOn:aStream valueNeeded:forValue inBlock:b for:aCompiler
+ expression codeOn:aStream inBlock:b for:aCompiler.
+ expression isBlock ifTrue:[
+ variable isLocal ifTrue:[
+ 'blockCheck code' printNL.
+ aStream nextPut:#blockRef
+ ]
+ ].
+
+ variable codeStoreOn:aStream inBlock:b valueNeeded:forValue for:aCompiler
+
+ "Modified: 4.9.1995 / 14:38:10 / claus"
+ "Modified: 1.3.1996 / 00:10:13 / cg"
+ "Created: 1.3.1996 / 00:41:43 / cg"
!
codeOn:aStream inBlock:b for:aCompiler
(self checkIncDecOn:aStream) ifTrue:[
- expression receiver codeOn:aStream inBlock:b for:aCompiler.
- ^ self
+ expression receiver codeOn:aStream inBlock:b for:aCompiler.
+ ^ self
].
- expression codeOn:aStream inBlock:b for:aCompiler.
- variable codeStoreOn:aStream inBlock:b valueNeeded:true for:aCompiler
+
+ self codeNormalOn:aStream valueNeeded:true inBlock:b for:aCompiler
+
+ "Modified: 1.3.1996 / 00:42:21 / cg"
! !
!AssignmentNode methodsFor:'evaluating'!
@@ -133,5 +159,5 @@
!AssignmentNode class methodsFor:'documentation'!
version
- ^ '$Header: /cvs/stx/stx/libcomp/Attic/AssignNd.st,v 1.15 1995-12-03 12:15:55 cg Exp $'
+ ^ '$Header: /cvs/stx/stx/libcomp/Attic/AssignNd.st,v 1.16 1996-03-01 00:00:46 cg Exp $'
! !
--- a/AssignmentNode.st Fri Mar 01 01:00:17 1996 +0100
+++ b/AssignmentNode.st Fri Mar 01 01:00:46 1996 +0100
@@ -11,10 +11,10 @@
"
ParseNode subclass:#AssignmentNode
- instanceVariableNames:'variable expression'
- classVariableNames:''
- poolDictionaries:''
- category:'System-Compiler-Support'
+ instanceVariableNames:'variable expression'
+ classVariableNames:''
+ poolDictionaries:''
+ category:'System-Compiler-Support'
!
!AssignmentNode class methodsFor:'documentation'!
@@ -59,50 +59,76 @@
!AssignmentNode methodsFor:'code generation'!
checkIncDecOn:aStream
+ "check if we can use incMvar / decMvar instruction.
+ If so, code it and return true.
+ Otherwise, return false."
+
|sel erec arg code|
(variable type == #MethodVariable) ifTrue:[
- expression isBinaryMessage ifTrue:[
- sel := expression selector.
- erec := expression receiver.
- ((sel == #+) or:[sel == #-]) ifTrue:[
- (erec type == #MethodVariable) ifTrue:[
- (erec index == variable index) ifTrue:[
- arg := expression arg1.
- arg isConstant ifTrue:[
- (arg value == 1) ifTrue:[
- (sel == #+) ifTrue:[
- code := #incMethodVar
- ] ifFalse:[
- code := #decMethodVar
- ].
- aStream nextPut:code; nextPut:(expression lineNumber); nextPut:(variable index).
- ^ true
- ]
- ]
- ]
- ]
- ]
- ]
+ expression isBinaryMessage ifTrue:[
+ sel := expression selector.
+ erec := expression receiver.
+
+ ((sel == #+) or:[sel == #-]) ifTrue:[
+ (erec type == #MethodVariable) ifTrue:[
+ (erec index == variable index) ifTrue:[
+ arg := expression arg1.
+ arg isConstant ifTrue:[
+ (arg value == 1) ifTrue:[
+ (sel == #+) ifTrue:[
+ code := #incMethodVar
+ ] ifFalse:[
+ code := #decMethodVar
+ ].
+ aStream nextPut:code; nextPut:(expression lineNumber); nextPut:(variable index).
+ ^ true
+ ]
+ ]
+ ]
+ ]
+ ]
+ ]
].
^ false
+
+ "Modified: 1.3.1996 / 00:08:02 / cg"
!
codeForSideEffectOn:aStream inBlock:b for:aCompiler
(self checkIncDecOn:aStream) ifTrue:[^ self].
- expression codeOn:aStream inBlock:b for:aCompiler.
- variable codeStoreOn:aStream inBlock:b valueNeeded:false for:aCompiler
+
+ self codeNormalOn:aStream valueNeeded:false inBlock:b for:aCompiler
"Modified: 4.9.1995 / 14:38:10 / claus"
+ "Modified: 1.3.1996 / 00:42:10 / cg"
+!
+
+codeNormalOn:aStream valueNeeded:forValue inBlock:b for:aCompiler
+ expression codeOn:aStream inBlock:b for:aCompiler.
+ expression isBlock ifTrue:[
+ variable isLocal ifTrue:[
+ 'blockCheck code' printNL.
+ aStream nextPut:#blockRef
+ ]
+ ].
+
+ variable codeStoreOn:aStream inBlock:b valueNeeded:forValue for:aCompiler
+
+ "Modified: 4.9.1995 / 14:38:10 / claus"
+ "Modified: 1.3.1996 / 00:10:13 / cg"
+ "Created: 1.3.1996 / 00:41:43 / cg"
!
codeOn:aStream inBlock:b for:aCompiler
(self checkIncDecOn:aStream) ifTrue:[
- expression receiver codeOn:aStream inBlock:b for:aCompiler.
- ^ self
+ expression receiver codeOn:aStream inBlock:b for:aCompiler.
+ ^ self
].
- expression codeOn:aStream inBlock:b for:aCompiler.
- variable codeStoreOn:aStream inBlock:b valueNeeded:true for:aCompiler
+
+ self codeNormalOn:aStream valueNeeded:true inBlock:b for:aCompiler
+
+ "Modified: 1.3.1996 / 00:42:21 / cg"
! !
!AssignmentNode methodsFor:'evaluating'!
@@ -133,5 +159,5 @@
!AssignmentNode class methodsFor:'documentation'!
version
- ^ '$Header: /cvs/stx/stx/libcomp/AssignmentNode.st,v 1.15 1995-12-03 12:15:55 cg Exp $'
+ ^ '$Header: /cvs/stx/stx/libcomp/AssignmentNode.st,v 1.16 1996-03-01 00:00:46 cg Exp $'
! !