--- 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 $'
! !