CascadeNode.st
changeset 4183 4e9dedb504ca
parent 4181 21f00e5abe0a
child 4184 e86cf3691f8c
--- a/CascadeNode.st	Tue Aug 08 18:09:17 2017 +0200
+++ b/CascadeNode.st	Tue Aug 08 18:22:43 2017 +0200
@@ -193,7 +193,7 @@
 !CascadeNode methodsFor:'evaluation'!
 
 evaluateForCascadeIn:anEnvironment
-    |t argValueArray|
+    |t argValueArray leftMostExpression sequence|
 
     selector := selector asSymbol.
 
@@ -201,7 +201,31 @@
         ^ super evaluateForCascadeIn:anEnvironment
     ].
 
-    t := receiver evaluateForCascadeIn:anEnvironment.
+    "/ new code: avoids recursion error for long cascades
+    leftMostExpression := receiver.
+    sequence := OrderedCollection new.
+    [leftMostExpression isCascade] whileTrue:[
+        sequence addFirst:leftMostExpression.
+        leftMostExpression := leftMostExpression receiver.
+    ].
+    
+    t := leftMostExpression evaluateForCascadeIn:anEnvironment. 
+    sequence do:[:eachCascadeMessage |
+        |eachSelector eachArgArray eachArgValueArray|
+        
+        eachSelector := eachCascadeMessage selector.
+        eachArgArray := eachCascadeMessage arguments.
+        eachArgArray size == 0 ifTrue:[
+            t perform:eachSelector.
+        ] ifFalse:[
+            eachArgValueArray := eachArgArray collect:[:arg | arg evaluateIn:anEnvironment]. 
+            t perform:eachSelector withArguments:eachArgValueArray.
+        ].    
+    ].
+    
+    "/ old code
+"/    t := receiver evaluateForCascadeIn:anEnvironment.
+
     argArray isNil ifTrue:[
         t perform:selector.
         ^ t
@@ -209,6 +233,8 @@
     argValueArray := argArray collect:[:arg | arg evaluateIn:anEnvironment]. 
     t perform:selector withArguments:argValueArray.
     ^ t
+
+    "Modified: / 08-08-2017 / 18:18:09 / cg"
 !
 
 evaluateIn:anEnvironment