--- a/CascadeNode.st Mon Sep 12 02:20:31 2011 +0200
+++ b/CascadeNode.st Mon Sep 12 10:18:55 2011 +0200
@@ -44,6 +44,46 @@
"
! !
+!CascadeNode methodsFor:'*VMMaker-C translation'!
+
+asTranslatorNodeIn: aTMethod
+ "make a CCodeGenerator equivalent of me"
+
+ ^Squeak::TStmtListNode new
+ setArguments: #()
+ statements:
+ (Array streamContents:
+ [:s| | receiverNode |
+ receiverNode := self realReceiver "receiver" asTranslatorNodeIn: aTMethod.
+ receiverNode isLeaf ifFalse:
+ [| varNode |
+ varNode := aTMethod newCascadeTempFor: receiverNode.
+ s nextPut: (Squeak::TAssignmentNode new
+ setVariable: varNode
+ expression: receiverNode).
+ receiverNode := varNode].
+ self messages do:
+ [ :msg | s nextPut: ((msg asTranslatorNodeIn: aTMethod) receiver: receiverNode)]]);
+ comment: (comments firstIfEmpty:nil)
+
+ "Modified: / 12-09-2011 / 10:18:44 / cg"
+!
+
+realReceiver
+ "return the real receiver
+ (sigh; ST/X encodes things differently)"
+
+ |r|
+
+ r := receiver.
+ [r isCascade] whileTrue:[
+ r := r receiver.
+ ].
+ ^ r
+
+ "Created: / 12-09-2011 / 10:01:48 / cg"
+! !
+
!CascadeNode methodsFor:'code generation'!
codeForCascadeOn:aStream inBlock:b for:aCompiler
@@ -59,6 +99,37 @@
!CascadeNode methodsFor:'enumerating'!
+messages
+ "helper for parse tree walking"
+
+ "/ sigh; ST/X encodes things differently ...
+
+ |r nd msgs msg|
+
+ msgs := OrderedCollection new.
+
+ r := receiver.
+ [r isCascade] whileTrue:[
+ r := r receiver.
+ ].
+ r := r receiver.
+
+ nd := self.
+ [nd isCascade] whileTrue:[
+ msg := MessageNode new.
+ msg receiver:r selector:nd selector args:nd args lineno:nd lineNumber.
+ msgs addFirst:msg.
+ nd := nd receiver.
+ ].
+ msg := MessageNode new.
+ msg receiver:r selector:nd selector args:nd args lineno:nd lineNumber.
+ msgs addFirst:msg.
+
+ ^ msgs
+
+ "Created: / 12-09-2011 / 10:04:31 / cg"
+!
+
nodeDo:anEnumerator
"helper for parse tree walking"
@@ -136,6 +207,8 @@
|selectorParts|
selectorParts := selector asCollectionOfSubstringsSeparatedBy:$:.
+ selectorParts last isEmpty ifTrue:[selectorParts := selectorParts copyWithoutLast:1].
+
receiver printOn:aStream indent:i.
aStream nextPutAll:'; '.
argArray size == 0 ifTrue:[
@@ -152,7 +225,7 @@
]
]
- "Modified: / 20-04-2005 / 14:35:39 / cg"
+ "Modified: / 12-09-2011 / 09:46:45 / cg"
! !
!CascadeNode methodsFor:'testing'!
@@ -177,9 +250,9 @@
!CascadeNode class methodsFor:'documentation'!
version
- ^ '$Header: /cvs/stx/stx/libcomp/CascadeNode.st,v 1.29 2011-07-25 22:32:34 vrany Exp $'
+ ^ '$Header: /cvs/stx/stx/libcomp/CascadeNode.st,v 1.30 2011-09-12 08:18:55 cg Exp $'
!
version_CVS
- ^ '$Header: /cvs/stx/stx/libcomp/CascadeNode.st,v 1.29 2011-07-25 22:32:34 vrany Exp $'
+ ^ '$Header: /cvs/stx/stx/libcomp/CascadeNode.st,v 1.30 2011-09-12 08:18:55 cg Exp $'
! !