*** empty log message ***
authorClaus Gittinger <cg@exept.de>
Thu, 20 Jul 2000 19:57:00 +0200
changeset 1059 7ce5819138e8
parent 1058 e77b19b82125
child 1060 9978f9d22dde
*** empty log message ***
MessageNode.st
--- a/MessageNode.st	Thu Jul 20 18:28:20 2000 +0200
+++ b/MessageNode.st	Thu Jul 20 19:57:00 2000 +0200
@@ -481,7 +481,7 @@
         ].
         arg1 isBlock ifFalse:[
             arg1 isConstant ifFalse:[
-                ^ 'will fail at runtime, if argument to ' , selector , ' does not evaluate to a block'
+                ^ 'will fail at runtime, if argument to ' , selector , ' does not evaluate to a block or respond reasonable to #value'
             ].
         ]
     ].
@@ -493,13 +493,13 @@
         ].
         arg1 isBlock ifFalse:[
             arg1 isConstant ifFalse:[
-                ^ 'will fail at runtime, if 1st. argument to ' , selector , ' does not evaluate to a block'
+                ^ 'will fail at runtime, if 1st. argument to ' , selector , ' does not evaluate to a block or respond reasonable to #value'
             ]
         ].
         arg2 := argArray at:2.
         arg2 isBlock ifFalse:[
             arg2 isConstant ifFalse:[
-                ^ 'will fail at runtime, if 2nd. argument to ' , selector , ' does not evaluate to a block'
+                ^ 'will fail at runtime, if 2nd. argument to ' , selector , ' does not evaluate to a block or respond reasonable to #value'
             ]
         ]
     ].
@@ -513,11 +513,11 @@
              only warn, if code was originally parenthized
             "
             receiver parenthized ifTrue:[
-                ^ 'will fail at runtime, if receiver of ' , selector , ' does not evaluate to a block'
+                ^ 'will fail at runtime, if receiver of ' , selector , ' does not evaluate to a block or respond reasonable to #value'
             ]
         ].
         arg1 isBlock ifFalse:[
-            ^ 'will fail at runtime, if argument to ' , selector , ' does not evaluate to a block'
+            ^ 'will fail at runtime, if argument to ' , selector , ' does not evaluate to a block or respond reasonable to #value'
         ].
     ].
 
@@ -540,7 +540,8 @@
 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 optByteCode theReceiver theArg pos1 pos2 pos3 code here jmp
+     block1 block2|
 
     theByteCode := #falseJump.
     theReceiver := receiver receiver.
@@ -580,7 +581,22 @@
     ].
 
     "/ code the if-block
-    (argArray at: 1) codeInlineOn:aStream inBlock:b valueNeeded:valueNeeded for:aCompiler.
+    block1 := argArray at: 1.
+    block1 isBlock ifTrue:[
+        block1 codeInlineOn:aStream inBlock:b valueNeeded:valueNeeded for:aCompiler.
+    ] ifFalse:[
+        block1 codeOn:aStream inBlock:b for:aCompiler.
+        block1 isConstant ifFalse:[
+            "/ send #value to it ...
+            aStream nextPut:#value.
+            (aCompiler hasLineNumber:#value) ifTrue:[
+                aStream nextPut:lineNr.
+            ]
+        ].
+        valueNeeded ifFalse:[
+            aStream nextPut:#drop
+        ].
+    ].
 
     aStream nextPut:#jump.
     pos3 := aStream position.
@@ -593,7 +609,22 @@
     code at:pos2 put:here.
 
     "/ code the else-block
-    (argArray at: 2) codeInlineOn:aStream inBlock:b valueNeeded:valueNeeded for:aCompiler.
+    block2 := argArray at: 2.
+    block2 isBlock ifTrue:[
+        block2 codeInlineOn:aStream inBlock:b valueNeeded:valueNeeded for:aCompiler.
+    ] ifFalse:[
+        block2 codeOn:aStream inBlock:b for:aCompiler.
+        block2 isConstant ifFalse:[
+            "/ send #value to it ...
+            aStream nextPut:#value.
+            (aCompiler hasLineNumber:#value) ifTrue:[
+                aStream nextPut:lineNr.
+            ]
+        ].
+        valueNeeded ifFalse:[
+            aStream nextPut:#drop
+        ]
+    ].
 
     code at:pos3 put:(aStream position)
 
@@ -604,7 +635,7 @@
     "generate code for (x and:[y]) ifxxx:[ ... ]"
 
     |theByteCode optByteCode andBlock theArg pos1 pos2 pos3 code here jmp
-     receiver1 receiver2 optByteCode2 theArg2|
+     receiver1 receiver2 optByteCode2 theArg2 block|
 
     theByteCode := #falseJump.
     receiver1 := receiver receiver.
@@ -660,7 +691,22 @@
     (selector == #ifFalse:) ifTrue:[
         code at:pos1 put:(aStream position)
     ].
-    (argArray at: 1) codeInlineOn:aStream inBlock:b valueNeeded:valueNeeded for:aCompiler.
+    block := argArray at: 1.
+    block isBlock ifTrue:[
+        block codeInlineOn:aStream inBlock:b valueNeeded:valueNeeded for:aCompiler.
+    ] ifFalse:[
+        block codeOn:aStream inBlock:b for:aCompiler.
+        block isConstant ifFalse:[
+            "/ send #value to it ...
+            aStream nextPut:#value.
+            (aCompiler hasLineNumber:#value) ifTrue:[
+                aStream nextPut:lineNr.
+            ]
+        ].
+        valueNeeded ifFalse:[
+            aStream nextPut:#drop
+        ]
+    ].
 
     valueNeeded ifTrue:[
         aStream nextPut:#jump.
@@ -898,7 +944,7 @@
     "generate code for x ifxxx:[ ... ] yyy:[ ...]"
 
     |pos pos2 theReceiver theArg theByteCode optByteCode subsel code needLineNr
-     needJump block1|
+     needJump block1 block2|
 
     theReceiver := receiver.
 
@@ -922,12 +968,9 @@
     (selector == #ifTrue:ifFalse:) ifTrue:[
         theByteCode := #falseJump
     ] ifFalse:[
-        (selector == #ifFalse:ifTrue:) ifTrue:[
-            theByteCode := #trueJump
-        ]
+        theByteCode := #trueJump
     ].
-    optByteCode := self optimizedConditionFor:theReceiver
-                                         with:theByteCode.
+    optByteCode := self optimizedConditionFor:theReceiver with:theByteCode.
     optByteCode notNil ifTrue:[
         ((optByteCode == #eqJump) or:[optByteCode == #notEqJump]) ifTrue:[
             theArg := theReceiver arg1
@@ -935,48 +978,75 @@
         theReceiver := theReceiver receiver.
         theByteCode := optByteCode
     ].
-    theByteCode notNil ifTrue:[
-        theReceiver codeOn:aStream inBlock:b for:aCompiler.
-
-        needLineNr := true.
-        theArg isNil ifTrue:[
-            theReceiver isMessage ifTrue:[
-                (aCompiler hasLineNumber:(theReceiver selector)) ifTrue:[
-                    theReceiver lineNumber == lineNr ifTrue:[
-                        needLineNr := false
-                    ]
+    theReceiver codeOn:aStream inBlock:b for:aCompiler.
+
+    needLineNr := true.
+    theArg isNil ifTrue:[
+        theReceiver isMessage ifTrue:[
+            (aCompiler hasLineNumber:(theReceiver selector)) ifTrue:[
+                theReceiver lineNumber == lineNr ifTrue:[
+                    needLineNr := false
                 ]
             ]
-        ] ifFalse:[
-            theArg codeOn:aStream inBlock:b for:aCompiler
+        ]
+    ] ifFalse:[
+        theArg codeOn:aStream inBlock:b for:aCompiler
+    ].
+
+    needLineNr ifTrue:[
+        (lineNr between:1 and:255) ifTrue:[
+            aStream nextPut:#lineno; nextPut:lineNr.
+        ]
+    ].
+
+    aStream nextPut:theByteCode.
+    pos := aStream position.
+    aStream nextPut:0.
+    needJump := true.
+    block1 := argArray at:1.
+    block1 isBlock ifTrue:[
+        block1 codeInlineOn:aStream inBlock:b valueNeeded:valueNeeded for:aCompiler.
+        block1 endsWithReturn ifTrue:[
+            needJump := false
         ].
-
-        needLineNr ifTrue:[
-            (lineNr between:1 and:255) ifTrue:[
-                aStream nextPut:#lineno; nextPut:lineNr.
+    ] ifFalse:[
+        block1 codeOn:aStream inBlock:b for:aCompiler.
+        block1 isConstant ifFalse:[
+            "/ send #value to it ...
+            aStream nextPut:#value.
+            (aCompiler hasLineNumber:#value) ifTrue:[
+                aStream nextPut:lineNr.
             ]
         ].
-
-        aStream nextPut:theByteCode.
-        pos := aStream position.
-        aStream nextPut:0.
-        block1 := argArray at:1.
-        block1 codeInlineOn:aStream inBlock:b valueNeeded:valueNeeded for:aCompiler.
-        needJump := true.
-        (block1 isBlock and:[block1 endsWithReturn]) ifTrue:[
-            needJump := false
+        valueNeeded ifFalse:[
+            aStream nextPut:#drop
         ].
-        needJump ifTrue:[
-            aStream nextPut:#jump.
-            pos2 := aStream position.
-            aStream nextPut:0.
+    ].
+    needJump ifTrue:[
+        aStream nextPut:#jump.
+        pos2 := aStream position.
+        aStream nextPut:0.
+    ].
+    code := aStream contents.
+    code at:pos put:(aStream position).
+    block2 := (argArray at:2).
+    block2 isBlock ifTrue:[
+        block2 codeInlineOn:aStream inBlock:b valueNeeded:valueNeeded for:aCompiler.
+    ] ifFalse:[
+        block2 codeOn:aStream inBlock:b for:aCompiler.
+        block2 isConstant ifFalse:[
+            "/ send #value to it ...
+            aStream nextPut:#value.
+            (aCompiler hasLineNumber:#value) ifTrue:[
+                aStream nextPut:lineNr.
+            ]
         ].
-        code := aStream contents.
-        code at:pos put:(aStream position).
-        (argArray at:2) codeInlineOn:aStream inBlock:b valueNeeded:valueNeeded for:aCompiler.
-        needJump ifTrue:[
-            code at:pos2 put:(aStream position)
-        ]
+        valueNeeded ifFalse:[
+            aStream nextPut:#drop
+        ].
+    ].
+    needJump ifTrue:[
+        code at:pos2 put:(aStream position)
     ]
 
     "Modified: 9.11.1996 / 19:53:52 / cg"
@@ -987,7 +1057,7 @@
      or: x ifNil:const1 ifNotNil:const2"
 
     |pos pos2 theReceiver theArg theByteCode optByteCode subsel code
-     needLineNr arg1 arg2|
+     needLineNr block1 block2|
 
     theReceiver := receiver.
 
@@ -1019,11 +1089,21 @@
     aStream nextPut:theByteCode.
     pos := aStream position.
     aStream nextPut:0.
-    arg1 := argArray at: 1.
-    arg1 isBlock ifTrue:[
-        arg1 codeInlineOn:aStream inBlock:b valueNeeded:valueNeeded for:aCompiler.
+    block1 := argArray at: 1.
+    block1 isBlock ifTrue:[
+        block1 codeInlineOn:aStream inBlock:b valueNeeded:valueNeeded for:aCompiler.
     ] ifFalse:[
-        arg1 codeOn:aStream inBlock:b for:aCompiler
+        block1 codeOn:aStream inBlock:b for:aCompiler.
+        block1 isConstant ifFalse:[
+            "/ send #value to it ...
+            aStream nextPut:#value.
+            (aCompiler hasLineNumber:#value) ifTrue:[
+                aStream nextPut:lineNr.
+            ]
+        ].
+        valueNeeded ifFalse:[
+            aStream nextPut:#drop
+        ].
     ].
     aStream nextPut:#jump.
     pos2 := aStream position.
@@ -1031,11 +1111,21 @@
 
     code := aStream contents.
     code at:pos put:(aStream position).
-    arg2 := argArray at: 2.
-    arg2 isBlock ifTrue:[
-        arg2 codeInlineOn:aStream inBlock:b valueNeeded:valueNeeded for:aCompiler.
+    block2 := argArray at: 2.
+    block2 isBlock ifTrue:[
+        block2 codeInlineOn:aStream inBlock:b valueNeeded:valueNeeded for:aCompiler.
     ] ifFalse:[
-        arg2 codeOn:aStream inBlock:b for:aCompiler
+        block2 codeOn:aStream inBlock:b for:aCompiler.
+        block2 isConstant ifFalse:[
+            "/ send #value to it ...
+            aStream nextPut:#value.
+            (aCompiler hasLineNumber:#value) ifTrue:[
+                aStream nextPut:lineNr.
+            ]
+        ].
+        valueNeeded ifFalse:[
+            aStream nextPut:#drop
+        ].
     ].
 
     code := aStream contents.
@@ -1091,9 +1181,15 @@
         arg codeInlineOn:aStream inBlock:b valueNeeded:valueNeeded for:aCompiler.
     ] ifFalse:[
         arg codeOn:aStream inBlock:b for:aCompiler.
-        aStream nextPut:#value.
-        (aCompiler hasLineNumber:#value) ifTrue:[
-            aStream nextPut:lineNr.
+        arg isConstant ifFalse:[
+            "/ send #value to it
+            aStream nextPut:#value.
+            (aCompiler hasLineNumber:#value) ifTrue:[
+                aStream nextPut:lineNr.
+            ].
+        ].
+        valueNeeded ifFalse:[
+            aStream nextPut:#drop
         ].
     ].
 
@@ -1107,7 +1203,7 @@
     "generate code for x ifxxx:[ ... ]"
 
     |pos pos2 theReceiver theArg theByteCode optByteCode subsel code
-     needLineNr|
+     needLineNr block|
 
     theReceiver := receiver.
 
@@ -1138,8 +1234,7 @@
     ] ifFalse:[
         theByteCode := #trueJump
     ].
-    optByteCode := self optimizedConditionFor:theReceiver
-                                         with:theByteCode.
+    optByteCode := self optimizedConditionFor:theReceiver with:theByteCode.
     optByteCode notNil ifTrue:[
         ((optByteCode == #eqJump) or:[optByteCode == #notEqJump]) ifTrue:[
             theArg := theReceiver arg1
@@ -1173,7 +1268,22 @@
     aStream nextPut:theByteCode.
     pos := aStream position.
     aStream nextPut:0.
-    (argArray at: 1) codeInlineOn:aStream inBlock:b valueNeeded:valueNeeded for:aCompiler.
+    block := (argArray at:1).
+    block isBlock ifTrue:[
+        block codeInlineOn:aStream inBlock:b valueNeeded:valueNeeded for:aCompiler.
+    ] ifFalse:[
+        block codeOn:aStream inBlock:b for:aCompiler.
+        block isConstant ifFalse:[
+            "/ send #value to it ...
+            aStream nextPut:#value.
+            (aCompiler hasLineNumber:#value) ifTrue:[
+                aStream nextPut:lineNr.
+            ].
+        ].
+        valueNeeded ifFalse:[
+            aStream nextPut:#drop
+        ]
+    ].
 
     code := aStream contents.
     valueNeeded ifTrue:[
@@ -1276,7 +1386,11 @@
                 (arg1 isBlock not
                 or:[arg1 numArgs == 0]) ifTrue:[
                     ^ self codeIfNilOn:aStream inBlock:b valueNeeded:valueNeeded for:aCompiler.
-                ]
+                ].
+                (arg1 isConstant or:[arg1 isVariable]) ifTrue:[
+                    ^ self codeIfNilOn:aStream inBlock:b valueNeeded:valueNeeded for:aCompiler.
+                ].
+
             ].
         ].
 
@@ -1313,6 +1427,12 @@
             ]
         ].
 
+        ((selector == #ifTrue:) or:[selector == #ifFalse:]) ifTrue:[
+            (arg1 isConstant or:[arg1 isVariable]) ifTrue:[
+                ^ self codeIfOn:aStream inBlock:b valueNeeded:valueNeeded for:aCompiler.
+            ].
+        ].
+
         selector == #? ifTrue:[
             "/ only do short-circuit optimization, if arg is not a message;
             "/ (could have side-effects)
@@ -1342,8 +1462,8 @@
                 ]
             ].
 
-            (arg1 isConstant 
-            and:[arg2 isConstant]) ifTrue:[
+            ((arg1 isConstant or:[arg1 isVariable])
+            and:[arg2 isConstant or:[arg2 isVariable]]) ifTrue:[
                 ((selector == #ifTrue:ifFalse:) or:[selector == #ifFalse:ifTrue:]) ifTrue:[
                     ^ self codeIfElseOn:aStream inBlock:b valueNeeded:valueNeeded for:aCompiler.
                 ].
@@ -1548,7 +1668,7 @@
     "generate code for (x or:[y]) ifxxx:[ ... ] ifyyy:[ ... ]"
 
     |theByteCode optByteCode theReceiver theArg pos1 pos2 pos3 code here jmp
-     arg1 arg2 optJmp blockExpr|
+     block1 block2 optJmp blockExpr|
 
     theByteCode := #trueJump.
     theReceiver := receiver receiver.
@@ -1613,11 +1733,21 @@
     ].
 
     "/ code the if-block
-    arg1 := argArray at: 1.
-    arg1 isConstant ifTrue:[
-        arg1 codeOn:aStream inBlock:b for:aCompiler.
+    block1 := argArray at: 1.
+    block1 isBlock ifTrue:[
+        block1 codeInlineOn:aStream inBlock:b valueNeeded:valueNeeded for:aCompiler.
     ] ifFalse:[
-        arg1 codeInlineOn:aStream inBlock:b valueNeeded:valueNeeded for:aCompiler.
+        block1 codeOn:aStream inBlock:b for:aCompiler.
+        block1 isConstant ifFalse:[
+            "/ send #value to it ...
+            aStream nextPut:#value.
+            (aCompiler hasLineNumber:#value) ifTrue:[
+                aStream nextPut:lineNr.
+            ]
+        ].
+        valueNeeded ifFalse:[
+            aStream nextPut:#drop
+        ]
     ].
 
     aStream nextPut:#jump.
@@ -1631,11 +1761,21 @@
     code at:pos2 put:here.
 
     "/ code the else-block
-    arg2 := argArray at: 2.
-    arg2 isConstant ifTrue:[
-        arg2 codeOn:aStream inBlock:b for:aCompiler.
+    block2 := argArray at: 2.
+    block2 isBlock ifTrue:[
+        block2 codeInlineOn:aStream inBlock:b valueNeeded:valueNeeded for:aCompiler.
     ] ifFalse:[
-        arg2 codeInlineOn:aStream inBlock:b valueNeeded:valueNeeded for:aCompiler.
+        block2 codeOn:aStream inBlock:b for:aCompiler.
+        block2 isConstant ifFalse:[
+            "/ send #value to it ...
+            aStream nextPut:#value.
+            (aCompiler hasLineNumber:#value) ifTrue:[
+                aStream nextPut:lineNr.
+            ]
+        ].
+        valueNeeded ifFalse:[
+            aStream nextPut:#drop
+        ]
     ].
     code at:pos3 put:(aStream position)
 
@@ -1645,22 +1785,23 @@
 codeOrIfOn:aStream inBlock:b valueNeeded:valueNeeded for:aCompiler
     "generate code for (x or:[y]) ifxxx:[ ... ]"
 
-    |theByteCode optByteCode theReceiver theArg pos1 pos2 pos3 code here jmp|
+    |theByteCode optByteCode theReceiver theArg pos1 pos2 pos3 code here jmp
+     block|
 
     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
+        ((optByteCode == #eqJump) or:[optByteCode == #notEqJump]) ifTrue:[
+            theArg := theReceiver arg1
+        ].
+        theReceiver := theReceiver receiver.
+        theByteCode := optByteCode
     ].
     theReceiver codeOn:aStream inBlock:b for:aCompiler.
     theArg notNil ifTrue:[
-	theArg codeOn:aStream inBlock:b for:aCompiler
+        theArg codeOn:aStream inBlock:b for:aCompiler
     ].
     aStream nextPut:theByteCode.
     pos1 := aStream position.
@@ -1672,62 +1813,77 @@
 
 "new:"
     (selector == #ifTrue:) ifTrue:[
-	theByteCode := #falseJump
+        theByteCode := #falseJump
     ] ifFalse:[
-	theByteCode := #trueJump
+        theByteCode := #trueJump
     ].
     optByteCode := self optimizedConditionFor:theReceiver with:theByteCode.
     optByteCode notNil ifTrue:[
-	theReceiver isBlock ifTrue:[
-	    theReceiver := theReceiver statements expression
-	].
-	((optByteCode == #eqJump) or:[optByteCode == #notEqJump]) ifTrue:[
-	    theArg := theReceiver arg1
-	].
-	theReceiver := theReceiver receiver.
-	theByteCode := optByteCode.
-
-	theReceiver codeOn:aStream inBlock:b for:aCompiler.
-	theArg notNil ifTrue:[
-	    theArg codeOn:aStream inBlock:b for:aCompiler
-	].
-	aStream nextPut:theByteCode.
+        theReceiver isBlock ifTrue:[
+            theReceiver := theReceiver statements expression
+        ].
+        ((optByteCode == #eqJump) or:[optByteCode == #notEqJump]) ifTrue:[
+            theArg := theReceiver arg1
+        ].
+        theReceiver := theReceiver receiver.
+        theByteCode := optByteCode.
+
+        theReceiver codeOn:aStream inBlock:b for:aCompiler.
+        theArg notNil ifTrue:[
+            theArg codeOn:aStream inBlock:b for:aCompiler
+        ].
+        aStream nextPut:theByteCode.
 
     ] ifFalse:[
 "org"
-	theReceiver codeInlineOn:aStream inBlock:b for:aCompiler.
-	(selector == #ifTrue:) ifTrue:[
-	    jmp := #falseJump
-	] ifFalse:[
-	    jmp := #trueJump
-	].
-	aStream nextPut:jmp
+        theReceiver codeInlineOn:aStream inBlock:b for:aCompiler.
+        (selector == #ifTrue:) ifTrue:[
+            jmp := #falseJump
+        ] ifFalse:[
+            jmp := #trueJump
+        ].
+        aStream nextPut:jmp
     ].
     pos2 := aStream position.
     aStream nextPut:0.
     (selector == #ifTrue:) ifTrue:[
-	(aStream contents) at:pos1 put:(aStream position)
+        (aStream contents) at:pos1 put:(aStream position)
     ].
-    (argArray at: 1) codeInlineOn:aStream inBlock:b valueNeeded:valueNeeded for:aCompiler.
+    block := argArray at: 1.
+    block isBlock ifTrue:[
+        block codeInlineOn:aStream inBlock:b valueNeeded:valueNeeded for:aCompiler.
+    ] ifFalse:[
+        block codeOn:aStream inBlock:b for:aCompiler.
+        block isConstant ifFalse:[
+            "/ send #value to it ...
+            aStream nextPut:#value.
+            (aCompiler hasLineNumber:#value) ifTrue:[
+                aStream nextPut:lineNr.
+            ]
+        ].
+        valueNeeded ifFalse:[
+            aStream nextPut:#drop
+        ]
+    ].
 
     code := aStream contents.
     valueNeeded ifTrue:[
-	aStream nextPut:#jump.
-	pos3 := aStream position.
-	aStream nextPut:0.
-	here := aStream position.
-	(selector == #ifFalse:) ifTrue:[
-	    code at:pos1 put:here
-	].
-	code at:pos2 put:here.
-	aStream nextPut:#pushNil.
-	code at:pos3 put:(aStream position)
+        aStream nextPut:#jump.
+        pos3 := aStream position.
+        aStream nextPut:0.
+        here := aStream position.
+        (selector == #ifFalse:) ifTrue:[
+            code at:pos1 put:here
+        ].
+        code at:pos2 put:here.
+        aStream nextPut:#pushNil.
+        code at:pos3 put:(aStream position)
     ] ifFalse:[
-	here := aStream position.
-	(selector == #ifFalse:) ifTrue:[
-	    code at:pos1 put:here
-	].
-	code at:pos2 put:here
+        here := aStream position.
+        (selector == #ifFalse:) ifTrue:[
+            code at:pos1 put:here
+        ].
+        code at:pos2 put:here
     ]
 
     "Modified: 9.11.1996 / 19:52:26 / cg"
@@ -2887,5 +3043,5 @@
 !MessageNode class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /cvs/stx/stx/libcomp/MessageNode.st,v 1.114 2000-07-20 16:28:20 cg Exp $'
+    ^ '$Header: /cvs/stx/stx/libcomp/MessageNode.st,v 1.115 2000-07-20 17:57:00 cg Exp $'
 ! !