care for block-stores into outer contexts
authorClaus Gittinger <cg@exept.de>
Fri, 01 Mar 1996 01:00:46 +0100
changeset 219 6b977f472cda
parent 218 748b4c509a51
child 220 ebf4fd9776ce
care for block-stores into outer contexts
AssignNd.st
AssignmentNode.st
--- 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 $'
 ! !