MessageNode.st
changeset 1384 0db9682870d9
parent 1382 10281d2f42d1
child 1387 ddc5f8d9b562
--- a/MessageNode.st	Fri Mar 28 15:39:23 2003 +0100
+++ b/MessageNode.st	Fri Mar 28 15:41:56 2003 +0100
@@ -318,6 +318,10 @@
     ^ selector
 !
 
+selector:s
+    selector := s asSymbolIfInterned ? s.
+!
+
 selectorPosition
     "return the value of the instance variable 'selectorPosition' (automatically generated)"
 
@@ -437,8 +441,6 @@
 plausibilityCheck
     |rec arg1 arg2 arg1Value operand|
 
-    selector := selector asSymbol.
-
     (argArray size > 0) ifTrue:[
         arg1 := argArray at:1
     ].
@@ -780,7 +782,6 @@
 
     realReceiver := self realReceiver.
     isSuper := realReceiver isSuper.
-    selector := selector asSymbol.
 
     argArray isNil ifTrue:[
         nargs := 0
@@ -1328,7 +1329,6 @@
 
     realReceiver := self realReceiver.
     isSuper := realReceiver isSuper.
-    selector := selector asSymbol.
 
     argArray isNil ifTrue:[
         nargs := 0
@@ -1974,7 +1974,6 @@
     |nargs isBuiltIn code codeL litIndex cls clsLitIndex isSuper realReceiver noSendDrop|
 
     noSendDrop := aCompiler class newCodeSet == true.
-    selector := selector asSymbol.
 
     realReceiver := self realReceiver.
     isSuper := realReceiver isSuper.
@@ -2853,11 +2852,65 @@
 
 !MessageNode methodsFor:'evaluation'!
 
-evaluate
+evaluateForCascadeIn:anEnvironment
+    |r a1 a2 a3 nargs argValueArray class|
+
+    receiver isSuper ifTrue:[
+        r := receiver value.
+        class := receiver definingClass.
+        receiver isHere ifFalse:[
+            class := class superclass.
+        ].
+        argArray notNil ifTrue:[
+            argValueArray := argArray collect:[:arg | arg evaluateIn:anEnvironment].
+        ] ifFalse:[
+            argValueArray := #()
+        ].
+        r perform:selector inClass:class withArguments:argValueArray.
+        ^ r
+    ].
+
+    r := receiver evaluateIn:anEnvironment.
+    argArray isNil ifTrue:[
+        r perform:selector.
+        ^ r
+    ].
+    nargs := argArray size.
+    a1 := (argArray at:1) evaluateIn:anEnvironment.
+    (nargs == 1) ifTrue:[
+        r perform:selector with:a1.
+        ^ r
+    ].
+    a2 := (argArray at:2) evaluateIn:anEnvironment.
+    (nargs == 2) ifTrue:[
+        r perform:selector with:a1
+                           with:a2.
+        ^ r
+    ].
+    a3 := (argArray at:3) evaluateIn:anEnvironment.
+    (nargs == 3) ifTrue:[
+        r perform:selector with:a1
+                           with:a2
+                           with:a3.
+        ^ r
+    ].
+    argValueArray := Array new:nargs.
+    argValueArray at:1 put:a1.
+    argValueArray at:2 put:a2.
+    argValueArray at:3 put:a3.
+    3 to:nargs do:[:idx | 
+                    |argVal|
+
+                    argVal := (argArray at:3) evaluateIn:anEnvironment.
+                    argValueArray at:idx put:argVal.
+                  ].
+    r perform:selector withArguments:argValueArray.
+    ^ r
+!
+
+evaluateIn:anEnvironment
     |r nargs argValueArray class|
 
-    selector := selector asSymbol.
-
     receiver isSuper ifTrue:[
         r := receiver value.
         receiver isHere ifTrue:[
@@ -2866,84 +2919,38 @@
             class := receiver definingClass superclass.
         ].
         argArray notNil ifTrue:[
-            argValueArray := argArray collect:[:arg | arg evaluate].
+            argValueArray := argArray collect:[:arg | arg evaluateIn:anEnvironment].
         ] ifFalse:[
             argValueArray := #()
         ].
         ^ r perform:selector inClass:class withArguments:argValueArray
     ].
-
+    r := receiver evaluateIn:anEnvironment.
 
     argArray isNil ifTrue:[
-        ^ (receiver evaluate) perform:selector
+        ^ r perform:selector
     ].
     nargs := argArray size.
     (nargs == 0) ifTrue:[
-        ^ (receiver evaluate) perform:selector
+        ^ r perform:selector
     ].
     (nargs == 1) ifTrue:[
-        ^ (receiver evaluate) perform:selector with:(argArray at:1) evaluate
+        ^ r perform:selector 
+            with:((argArray at:1) evaluateIn:anEnvironment)
     ].
     (nargs == 2) ifTrue:[
-        ^ (receiver evaluate) perform:selector
-                                 with:(argArray at:1) evaluate
-                                 with:(argArray at:2) evaluate
+        ^ r perform:selector
+            with:((argArray at:1) evaluateIn:anEnvironment)
+            with:((argArray at:2) evaluateIn:anEnvironment)
     ].
     (nargs == 3) ifTrue:[
-        ^ (receiver evaluate) perform:selector
-                                 with:(argArray at:1) evaluate
-                                 with:(argArray at:2) evaluate
-                                 with:(argArray at:3) evaluate
+        ^ r perform:selector
+            with:((argArray at:1) evaluateIn:anEnvironment)
+            with:((argArray at:2) evaluateIn:anEnvironment)
+            with:((argArray at:3) evaluateIn:anEnvironment)
     ].
-    r := receiver evaluate.
-    argValueArray := argArray collect:[:arg | arg evaluate].
+    argValueArray := argArray collect:[:arg | arg evaluateIn:anEnvironment].
     ^ r perform:selector withArguments:argValueArray
-!
-
-evaluateForCascade
-    |r nargs argValueArray class|
-
-    selector := selector asSymbol.
-
-    receiver isSuper ifTrue:[
-        r := receiver value.
-        class := receiver definingClass.
-        receiver isHere ifFalse:[
-            class := class superclass.
-        ].
-        argArray notNil ifTrue:[
-            argValueArray := argArray collect:[:arg | arg evaluate].
-        ] ifFalse:[
-            argValueArray := #()
-        ].
-        r perform:selector inClass:class withArguments:argValueArray.
-        ^ r
-    ].
-
-    r := receiver evaluate.
-    argArray isNil ifTrue:[
-        r perform:selector.
-        ^ r
-    ].
-    nargs := argArray size.
-    (nargs == 1) ifTrue:[
-        r perform:selector with:(argArray at:1) evaluate.
-        ^ r
-    ].
-    (nargs == 2) ifTrue:[
-        r perform:selector with:(argArray at:1) evaluate
-                           with:(argArray at:2) evaluate.
-        ^ r
-    ].
-    (nargs == 3) ifTrue:[
-        r perform:selector with:(argArray at:1) evaluate
-                           with:(argArray at:2) evaluate
-                           with:(argArray at:3) evaluate.
-        ^ r
-    ].
-    argValueArray := argArray collect:[:arg | arg evaluate].
-    r perform:selector withArguments:argValueArray.
-    ^ r
 ! !
 
 !MessageNode methodsFor:'printing & storing'!
@@ -3059,6 +3066,10 @@
     ^ true
 !
 
+numArgs
+    ^ argArray size
+!
+
 realReceiver
     receiver isCascade ifTrue:[
         ^ receiver realReceiver
@@ -3075,5 +3086,5 @@
 !MessageNode class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /cvs/stx/stx/libcomp/MessageNode.st,v 1.126 2003-03-27 22:31:40 cg Exp $'
+    ^ '$Header: /cvs/stx/stx/libcomp/MessageNode.st,v 1.127 2003-03-28 14:40:25 cg Exp $'
 ! !