--- 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