MessageNode.st
changeset 338 8ab1a2715ab1
parent 334 cd7491b7ad33
child 349 7632e597a3df
--- a/MessageNode.st	Thu Sep 05 19:38:50 1996 +0200
+++ b/MessageNode.st	Fri Sep 06 13:26:04 1996 +0200
@@ -341,6 +341,70 @@
 
 !MessageNode methodsFor:'code generation'!
 
+codeAndIfElseOn:aStream inBlock:b valueNeeded:valueNeeded for:aCompiler
+    "generate code for (x and:[y]) ifxxx:[ ... ] ifyyy:[ ... ]"
+
+    |theByteCode optByteCode theReceiver theArg pos1 pos2 pos3 code here jmp|
+
+    theByteCode := #falseJump.
+    theReceiver := receiver receiver.
+
+    optByteCode := self optimizedConditionFor:theReceiver
+                                         with:theByteCode.
+    optByteCode notNil ifTrue:[
+        ((optByteCode == #eqJump) or:[optByteCode == #notEqJump]) ifTrue:[
+            theArg := theReceiver arg1
+        ].
+        theReceiver := theReceiver receiver.
+        theByteCode := optByteCode
+    ].
+    "/ code the left-of the and-part
+    theReceiver codeOn:aStream inBlock:b for:aCompiler.
+    theArg notNil ifTrue:[
+        theArg codeOn:aStream inBlock:b for:aCompiler
+    ].
+    aStream nextPut:theByteCode.
+    pos1 := aStream position.   "/ remember branch target of left-fail branch
+    aStream nextPut:0.
+
+    "/ code the right of the and-part
+    theReceiver := receiver arg1.
+    theReceiver codeInlineOn:aStream inBlock:b for:aCompiler.
+    (selector == #ifTrue:ifFalse:) ifTrue:[
+        jmp := #falseJump
+    ] ifFalse:[
+        jmp := #trueJump
+    ].
+    aStream nextPut:jmp.
+    pos2 := aStream position.   "/ remember branch target of right-fail branch 
+    aStream nextPut:0.
+
+    code := aStream contents.
+    (selector == #ifFalse:ifTrue:) ifTrue:[
+        code at:pos1 put:(aStream position)
+    ].
+
+    "/ code the if-block
+    (argArray at: 1) codeInlineOn:aStream inBlock:b valueNeeded:valueNeeded for:aCompiler.
+
+    aStream nextPut:#jump.
+    pos3 := aStream position.
+    aStream nextPut:0.
+
+    here := aStream position.
+    (selector == #ifTrue:ifFalse:) ifTrue:[
+        code at:pos1 put:here
+    ].
+    code at:pos2 put:here.
+
+    "/ code the else-block
+    (argArray at: 2) codeInlineOn:aStream inBlock:b valueNeeded:valueNeeded for:aCompiler.
+
+    code at:pos3 put:(aStream position)
+
+    "Created: 6.9.1996 / 12:56:23 / cg"
+!
+
 codeAndIfOn:aStream inBlock:b valueNeeded:valueNeeded for:aCompiler
     "generate code for (x and:[y]) ifxxx:[ ... ]"
 
@@ -530,7 +594,6 @@
 
     theReceiver := receiver.
 
-"
     (theReceiver isMessage) ifTrue:[
         subsel := theReceiver selector.
         (subsel == #and:) ifTrue:[
@@ -542,7 +605,6 @@
             ^ self
         ]
     ].
-"
     (selector == #ifTrue:ifFalse:) ifTrue:[
         theByteCode := #falseJump
     ] ifFalse:[
@@ -604,7 +666,7 @@
         ]
     ]
 
-    "Modified: 19.8.1996 / 14:36:52 / cg"
+    "Modified: 6.9.1996 / 13:09:11 / cg"
 !
 
 codeIfOn:aStream inBlock:b valueNeeded:valueNeeded for:aCompiler
@@ -955,6 +1017,70 @@
     "Modified: 17.6.1996 / 16:13:24 / cg"
 !
 
+codeOrIfElseOn:aStream inBlock:b valueNeeded:valueNeeded for:aCompiler
+    "generate code for (x or:[y]) ifxxx:[ ... ] ifyyy:[ ... ]"
+
+    |theByteCode optByteCode theReceiver theArg pos1 pos2 pos3 code here jmp|
+
+    theByteCode := #trueJump.
+    theReceiver := receiver receiver.
+
+    optByteCode := self optimizedConditionFor:theReceiver
+                                         with:theByteCode.
+    optByteCode notNil ifTrue:[
+        ((optByteCode == #eqJump) or:[optByteCode == #notEqJump]) ifTrue:[
+            theArg := theReceiver arg1
+        ].
+        theReceiver := theReceiver receiver.
+        theByteCode := optByteCode
+    ].
+    "/ code the left-of the or-part
+    theReceiver codeOn:aStream inBlock:b for:aCompiler.
+    theArg notNil ifTrue:[
+        theArg codeOn:aStream inBlock:b for:aCompiler
+    ].
+    aStream nextPut:theByteCode.
+    pos1 := aStream position.   "/ remember branch target of left-ok branch
+    aStream nextPut:0.
+
+    "/ code the right of the and-part
+    theReceiver := receiver arg1.
+    theReceiver codeInlineOn:aStream inBlock:b for:aCompiler.
+    (selector == #ifTrue:ifFalse:) ifTrue:[
+        jmp := #falseJump
+    ] ifFalse:[
+        jmp := #trueJump
+    ].
+    aStream nextPut:jmp.
+    pos2 := aStream position.   "/ remember branch target of right-fail branch 
+    aStream nextPut:0.
+
+    code := aStream contents.
+    (selector == #ifTrue:ifFalse:) ifTrue:[
+        code at:pos1 put:(aStream position)
+    ].
+
+    "/ code the if-block
+    (argArray at: 1) codeInlineOn:aStream inBlock:b valueNeeded:valueNeeded for:aCompiler.
+
+    aStream nextPut:#jump.
+    pos3 := aStream position.
+    aStream nextPut:0.
+
+    here := aStream position.
+    (selector == #ifFalse:ifTrue:) ifTrue:[
+        code at:pos1 put:here
+    ].
+    code at:pos2 put:here.
+
+    "/ code the else-block
+    (argArray at: 2) codeInlineOn:aStream inBlock:b valueNeeded:valueNeeded for:aCompiler.
+
+    code at:pos3 put:(aStream position)
+
+    "Created: 6.9.1996 / 13:08:52 / cg"
+!
+
 codeOrIfOn:aStream inBlock:b valueNeeded:valueNeeded for:aCompiler
     "generate code for (x or:[y]) ifxxx:[ ... ]"
 
@@ -1574,5 +1700,5 @@
 !MessageNode  class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /cvs/stx/stx/libcomp/MessageNode.st,v 1.51 1996-08-19 12:44:59 cg Exp $'
+    ^ '$Header: /cvs/stx/stx/libcomp/MessageNode.st,v 1.52 1996-09-06 11:26:04 cg Exp $'
 ! !