MessageNode.st
changeset 536 9fe0b3be6672
parent 531 1d037c37e5a2
child 537 09d4c2fd07cc
--- 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 $'
 ! !