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