MessageNode.st
changeset 574 993d1182782b
parent 570 e55ab798d077
child 576 5cb4af0eea67
--- a/MessageNode.st	Wed Jul 02 16:46:26 1997 +0200
+++ b/MessageNode.st	Wed Jul 02 17:35:44 1997 +0200
@@ -251,7 +251,10 @@
     receiver := r.
     selector := s asSymbol.
     argArray := a.
-    lineNr := l
+    lineNr := l.
+    self checkInlinability.
+
+    "Modified: 2.7.1997 / 17:01:24 / cg"
 !
 
 selector
@@ -260,6 +263,83 @@
 
 !MessageNode methodsFor:'checks'!
 
+checkInlinability
+    "early check for possible inlinability"
+
+    |numArgs arg1 arg2 arg3|
+
+    (numArgs := argArray size) >= 1 ifTrue:[
+        arg1 := argArray at:1.
+    ].
+    numArgs == 0 ifTrue:[
+        (selector == #whileTrue 
+        or:[selector == #whileFalse]) ifTrue:[
+            receiver isBlock ifTrue:[
+                receiver possiblyInlined:true
+            ].
+        ].
+    ].
+
+    numArgs == 1 ifTrue:[
+        (selector == #ifTrue: 
+        or:[selector == #ifFalse:]) ifTrue:[
+            arg1 isBlock ifTrue:[
+                arg1 possiblyInlined:true
+            ].
+        ].
+
+        (selector == #whileTrue: 
+        or:[selector == #whileFalse:]) ifTrue:[
+            arg1 isBlock ifTrue:[
+                arg1 possiblyInlined:true
+            ].
+            receiver isBlock ifTrue:[
+                receiver possiblyInlined:true
+            ].
+        ].
+        selector == #timesRepeat: ifTrue:[
+            arg1 isBlock ifTrue:[
+                arg1 possiblyInlined:true       
+            ]
+        ].
+        ^ self
+    ].
+    numArgs >= 2 ifTrue:[
+        arg2 := argArray at:2.
+    ].    
+    numArgs == 2 ifTrue:[
+        (selector == #ifTrue:ifFalse:
+        or:[selector == #ifFalse:ifTrue:]) ifTrue:[
+            (arg1 isBlock 
+            and:[arg2 isBlock]) ifTrue:[
+                arg1 possiblyInlined:true.
+                arg2 possiblyInlined:true.
+            ].
+        ].
+        selector == #to:do: ifTrue:[
+            arg2 isBlock ifTrue:[
+                arg2 possiblyInlined:true.
+            ].
+        ].
+        ^ self
+    ].
+    numArgs >= 3 ifTrue:[
+        arg3 := argArray at:3.
+    ].    
+    numArgs == 3 ifTrue:[
+        selector == #to:by:do: ifTrue:[
+            arg3 isBlock ifTrue:[
+                arg3 possiblyInlined:true.
+            ].
+        ].
+        ^ self
+    ].
+    ^ self
+
+    "Created: 2.7.1997 / 17:01:10 / cg"
+    "Modified: 2.7.1997 / 17:33:20 / cg"
+!
+
 plausibilityCheck
     |rec arg operand|
 
@@ -798,7 +878,9 @@
                 ^ self
             ].
             ((selector == #whileTrue) or:[selector == #whileFalse]) ifTrue:[
-                ^ self codeWhileOn:aStream inBlock:b valueNeeded:valueNeeded for:aCompiler.
+                receiver isInlinable ifTrue:[
+                    ^ self codeWhileOn:aStream inBlock:b valueNeeded:valueNeeded for:aCompiler.
+                ]
             ].
         ].
 
@@ -818,7 +900,7 @@
              ].
         ].
 
-        (arg1 isBlock) ifTrue:[
+        (arg1 isBlock and:[arg1 isInlinable]) ifTrue:[
             ((selector == #ifTrue:) or:[selector == #ifFalse:]) ifTrue:[
                 receiver isBlock ifFalse:[
                     ^ self codeIfOn:aStream inBlock:b valueNeeded:valueNeeded for:aCompiler.
@@ -862,8 +944,8 @@
 
         ((selector == #ifTrue:ifFalse:) or:[selector == #ifFalse:ifTrue:]) ifTrue:[
             receiver isBlock ifFalse:[
-                arg1 isBlock ifTrue:[
-                    arg2 isBlock ifTrue:[
+                (arg1 isBlock and:[arg1 isInlinable]) ifTrue:[
+                    (arg2 isBlock and:[arg2 isInlinable]) ifTrue:[
                         ^ self codeIfElseOn:aStream inBlock:b valueNeeded:valueNeeded for:aCompiler.
                     ]
                 ]
@@ -871,12 +953,7 @@
         ].
 
         selector == #to:do: ifTrue:[
-            okToInline := true.
-
-            (arg2 isBlock and:[arg2 numArgs == 1]) ifFalse:[
-                okToInline := false.
-            ].
-            okToInline ifTrue:[
+            (arg2 isBlock and:[arg2 isInlinable and:[arg2 numArgs == 1]]) ifTrue:[
                 ^ self codeToDoOn:aStream inBlock:b valueNeeded:valueNeeded for:aCompiler
             ]
         ].
@@ -892,11 +969,11 @@
         selector == #to:by:do: ifTrue:[
             okToInline := true.
 
+            "/ step must be a constant (need to know how to compare)
             (arg2 isConstant and:[arg2 type == #Integer]) ifFalse:[
-                "/ step must be a constant (need to know how to compare)
                 okToInline := false.
             ].
-            (arg3 isBlock and:[arg3 numArgs == 1]) ifFalse:[
+            (arg3 isBlock and:[arg3 isInlinable and:[arg3 numArgs == 1]]) ifTrue:[
                 okToInline := false.
             ].
             okToInline ifTrue:[
@@ -1064,7 +1141,7 @@
     ].
 
     "Modified: 3.9.1995 / 12:55:42 / claus"
-    "Modified: 27.6.1997 / 15:08:45 / cg"
+    "Modified: 2.7.1997 / 10:46:22 / cg"
 !
 
 codeOrIfElseOn:aStream inBlock:b valueNeeded:valueNeeded for:aCompiler
@@ -2122,5 +2199,5 @@
 !MessageNode class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /cvs/stx/stx/libcomp/MessageNode.st,v 1.76 1997-06-28 13:36:23 cg Exp $'
+    ^ '$Header: /cvs/stx/stx/libcomp/MessageNode.st,v 1.77 1997-07-02 15:34:38 cg Exp $'
 ! !