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