MessageNode.st
changeset 289 7134d1233ba6
parent 263 3b21d0991eff
child 308 fe3b95e6d9c0
--- a/MessageNode.st	Mon Jun 17 10:22:39 1996 +0200
+++ b/MessageNode.st	Mon Jun 17 16:13:49 1996 +0200
@@ -341,51 +341,6 @@
 
 !MessageNode methodsFor:'code generation'!
 
-XXcodeWhileOn:aStream inBlock:b valueNeeded:valueNeeded for:aCompiler
-    "generate code for [...] whilexxx:[ ... ]"
-
-    |pos pos2 theReceiver theArg theByteCode optByteCode|
-
-    (selector == #whileTrue:) ifTrue:[
-	theByteCode := #falseJump
-    ] ifFalse:[
-	theByteCode := #trueJump
-    ].
-
-    theReceiver := receiver.
-    optByteCode := self optimizedConditionFor:theReceiver with:theByteCode.
-    optByteCode notNil ifTrue:[
-	((optByteCode == #eqJump) or:[optByteCode == #notEqJump]) ifTrue:[
-	    theArg := receiver statements expression arg1
-	].
-	theReceiver := receiver statements expression receiver.
-	theByteCode := optByteCode
-    ].
-
-    valueNeeded ifTrue:[aStream nextPut:#pushNil].
-    pos := aStream position.
-    optByteCode notNil ifTrue:[
-	theReceiver codeOn:aStream inBlock:b for:aCompiler.
-	theArg notNil ifTrue:[
-	    theArg codeOn:aStream inBlock:b for:aCompiler
-	]
-    ] ifFalse:[
-	theReceiver codeInlineOn:aStream inBlock:b for:aCompiler
-    ].
-
-    (lineNr between:1 and:255) ifTrue:[
-	aStream nextPut:#lineno; nextPut:lineNr.
-    ].
-
-    aStream nextPut:theByteCode.
-    pos2 := aStream position.
-    aStream nextPut:0.
-    valueNeeded ifTrue:[aStream nextPut:#drop].
-    (argArray at:1) codeInlineOn:aStream inBlock:b valueNeeded:valueNeeded for:aCompiler.
-    aStream nextPut:#jump; nextPut:pos.
-    (aStream contents) at:pos2 put:(aStream position).
-!
-
 codeAndIfOn:aStream inBlock:b valueNeeded:valueNeeded for:aCompiler
     "generate code for (x and:[y]) ifxxx:[ ... ]"
 
@@ -449,34 +404,28 @@
     ]
 !
 
-codeAndOrOn:aStream inBlock:b valueNeeded:valueNeeded for:aCompiler
-    "generate code for x and/or:[y] - but not in an if"
-
-    |pos theReceiver theByteCode|
+codeAndOn:aStream inBlock:b valueNeeded:valueNeeded for:aCompiler
+    "generate code for (x and:[y])"
 
-self halt:'not yet implemented'.
-    theReceiver := receiver.
-    (selector == #and:) ifTrue:[
-	theByteCode := #falseJump
-    ] ifFalse:[
-	theByteCode := #trueJump
+    |pos1 rightExpr|
+
+    receiver codeOn:aStream inBlock:b for:aCompiler.
+    valueNeeded ifTrue:[
+        aStream nextPut:#dup.
     ].
-"
-    (self canOptimizeConditionFor:receiver) ifTrue:[
-	theByteCode := self optimizedConditionFor:theReceiver
-					     with:theByteCode.
-	theReceiver := theReceiver receiver
+    aStream nextPut:#falseJump.
+    pos1 := aStream position.
+    aStream nextPut:0.
+    valueNeeded ifTrue:[
+        aStream nextPut:#drop.
     ].
-"
-    theReceiver codeOn:aStream inBlock:b for:aCompiler.
-    aStream nextPut:theByteCode.
-    pos := aStream position.
-    aStream nextPut:0.
-    (argArray at: 1) codeInlineOn:aStream inBlock:b for:aCompiler.
-    (aStream contents) at:pos put:(aStream position).
-    valueNeeded ifFalse:[aStream nextPut:#drop]
+    rightExpr := argArray at:1.
+    rightExpr codeInlineOn:aStream inBlock:b valueNeeded:valueNeeded for:aCompiler.
 
-    "Created: 9.12.1995 / 23:05:52 / cg"
+    (aStream contents) at:pos1 put:(aStream position)
+
+    "Created: 17.6.1996 / 15:46:42 / cg"
+    "Modified: 17.6.1996 / 15:47:44 / cg"
 !
 
 codeForCascadeOn:aStream inBlock:b for:aCompiler
@@ -790,12 +739,17 @@
                     ^ self
                 ].
             ].
-"
-            ((selector == #and:) or:[selector == #or:]) ifTrue:[
-                self codeAndOrOn:aStream inBlock:b valueNeeded:valueNeeded for:aCompiler.
+
+            (selector == #or:) ifTrue:[
+                self codeOrOn:aStream inBlock:b valueNeeded:valueNeeded for:aCompiler.
                 ^ self
             ].
-"
+
+            (selector == #and:) ifTrue:[
+                self codeAndOn:aStream inBlock:b valueNeeded:valueNeeded for:aCompiler.
+                ^ self
+            ].
+
             (selector == #timesRepeat:) ifTrue:[
                 (receiver isConstant and:[receiver evaluate isNumber]) ifTrue:[
                     self codeTimesRepeatOn:aStream inBlock:b valueNeeded:valueNeeded for:aCompiler.
@@ -981,7 +935,7 @@
     ].
 
     "Modified: 3.9.1995 / 12:55:42 / claus"
-    "Modified: 17.4.1996 / 22:34:02 / cg"
+    "Modified: 17.6.1996 / 16:13:24 / cg"
 !
 
 codeOrIfOn:aStream inBlock:b valueNeeded:valueNeeded for:aCompiler
@@ -1072,6 +1026,30 @@
     ]
 !
 
+codeOrOn:aStream inBlock:b valueNeeded:valueNeeded for:aCompiler
+    "generate code for (x or:[y])"
+
+    |pos1 rightExpr|
+
+    receiver codeOn:aStream inBlock:b for:aCompiler.
+    valueNeeded ifTrue:[
+        aStream nextPut:#dup.
+    ].
+    aStream nextPut:#trueJump.
+    pos1 := aStream position.
+    aStream nextPut:0.
+    valueNeeded ifTrue:[
+        aStream nextPut:#drop.
+    ].
+    rightExpr := argArray at:1.
+    rightExpr codeInlineOn:aStream inBlock:b valueNeeded:valueNeeded for:aCompiler.
+
+    (aStream contents) at:pos1 put:(aStream position)
+
+    "Created: 17.6.1996 / 15:40:22 / cg"
+    "Modified: 17.6.1996 / 15:47:22 / cg"
+!
+
 codeSendOn:aStream inBlock:b valueNeeded:valueNeeded for:aCompiler
     "like code on, but assumes that receiver has already been
      coded onto stack - needed for cascade"
@@ -1579,5 +1557,5 @@
 !MessageNode class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /cvs/stx/stx/libcomp/MessageNode.st,v 1.47 1996-04-25 17:09:13 cg Exp $'
+    ^ '$Header: /cvs/stx/stx/libcomp/MessageNode.st,v 1.48 1996-06-17 14:13:49 cg Exp $'
 ! !