--- a/MessageNode.st Wed Jun 18 12:07:16 1997 +0200
+++ b/MessageNode.st Wed Jun 18 12:08:12 1997 +0200
@@ -846,15 +846,35 @@
].
(nargs == 2) ifTrue:[
+ arg1 := argArray at:1.
+
((selector == #ifTrue:ifFalse:) or:[selector == #ifFalse:ifTrue:]) ifTrue:[
receiver isBlock ifFalse:[
- (argArray at:1) isBlock ifTrue:[
+ arg1 isBlock ifTrue:[
(argArray at:2) isBlock ifTrue:[
^ self codeIfElseOn:aStream inBlock:b valueNeeded:valueNeeded for:aCompiler.
]
]
]
].
+
+ selector == #to:do: ifTrue:[
+ (receiver isConstant
+ and:[receiver type == #Integer]) ifTrue:[
+ (arg1 isConstant
+ and:[arg1 type == #Integer]) ifTrue:[
+ receiver value <= arg1 value ifTrue:[
+ (argArray at:2) isBlock ifTrue:[
+ (argArray at:2) blockArgAccessed ifFalse:[
+ 'inline to:do: as timesRepeat ...' infoPrintCR.
+ ^ self codeSimpleToDoOn:aStream inBlock:b valueNeeded:valueNeeded for:aCompiler
+ ]
+ ].
+ ]
+ ]
+ ]
+ ].
+
isBuiltIn := aCompiler isBuiltIn2ArgSelector:selector forReceiver:receiver.
].
@@ -1017,7 +1037,7 @@
].
"Modified: 3.9.1995 / 12:55:42 / claus"
- "Modified: 4.6.1997 / 12:33:24 / cg"
+ "Modified: 18.6.1997 / 11:52:17 / cg"
!
codeOrIfElseOn:aStream inBlock:b valueNeeded:valueNeeded for:aCompiler
@@ -1337,6 +1357,57 @@
"Modified: 17.4.1996 / 22:33:35 / cg"
!
+codeSimpleToDoOn:aStream inBlock:b valueNeeded:valueNeeded for:aCompiler
+ "generate code for n to:n do:[:unusedArg | ... ]"
+
+ |pos pos2 start stop theReceiver lateEval|
+
+ start := receiver.
+ stop := (argArray at:1).
+ stop isConstant ifFalse:[self halt:'should not happen'].
+ (stop evaluate isMemberOf:SmallInteger) ifFalse:[self halt:'should not happen'].
+
+ start codeOn:aStream inBlock:b for:aCompiler.
+
+ lateEval := false.
+
+ valueNeeded ifTrue:[
+ "/ easily reconstructable - no need to keep on stack
+ start isConstant ifTrue:[
+ (start evaluate isMemberOf:SmallInteger) ifTrue:[
+ lateEval := true.
+ ]
+ ].
+ lateEval ifFalse:[
+ aStream nextPut:#dup
+ ].
+ ].
+
+ pos := aStream position.
+
+ aStream nextPut:#dup.
+ stop codeOn:aStream inBlock:b for:aCompiler.
+ aStream nextPut:#>.
+ (aCompiler hasLineNumber:selector) ifTrue:[
+ aStream nextPut:lineNr.
+ ].
+ aStream nextPut:#trueJump.
+ pos2 := aStream position.
+ aStream nextPut:0.
+
+ (argArray at:2) codeInlineOn:aStream inBlock:b valueNeeded:false for:aCompiler.
+ aStream nextPut:#plus1; nextPut:lineNr; nextPut:#jump; nextPut:pos.
+
+ (aStream contents) at:pos2 put:(aStream position).
+ aStream nextPut:#drop. "/ drop run variable
+ lateEval ifTrue:[
+ start codeOn:aStream inBlock:b for:aCompiler.
+ ]
+
+ "Created: 18.6.1997 / 11:51:53 / cg"
+ "Modified: 18.6.1997 / 11:55:50 / cg"
+!
+
codeTimesRepeatOn:aStream inBlock:b valueNeeded:valueNeeded for:aCompiler
"generate code for n timesRepeat:[ ... ]"
@@ -1801,5 +1872,5 @@
!MessageNode class methodsFor:'documentation'!
version
- ^ '$Header: /cvs/stx/stx/libcomp/MessageNode.st,v 1.65 1997-06-04 10:38:20 cg Exp $'
+ ^ '$Header: /cvs/stx/stx/libcomp/MessageNode.st,v 1.66 1997-06-18 10:08:12 cg Exp $'
! !