Added method IRBuilder>>#send:numArgs and IRBuilder>>#send:numArgs:toSuperOf:.
authorJan Vrany <jan.vrany@fit.cvut.cz>
Mon, 01 Dec 2008 19:01:08 +0000
changeset 5 b94aea1d3710
parent 4 7195866510e1
child 6 49a61123c743
Added method IRBuilder>>#send:numArgs and IRBuilder>>#send:numArgs:toSuperOf:. Those methods will be used by the Ruby compiler
IRBuilder.st
IRBuilderTest.st
IRBytecodeGenerator.st
IRDecompiler.st
IRInstruction.st
IRInterpreter.st
IRPrinter.st
IRSend.st
IRTranslator.st
stx_goodies_newcompiler.st
--- a/IRBuilder.st	Wed Nov 05 18:58:44 2008 +0000
+++ b/IRBuilder.st	Mon Dec 01 19:01:08 2008 +0000
@@ -256,6 +256,20 @@
 	self add: (IRInstruction send: selector)
 !
 
+send: selector numArgs: numArgs
+
+        self add: (IRInstruction send: selector numArgs: numArgs)
+
+    "Created: / 01-12-2008 / 19:56:10 / Jan Vrany <vranyj1@fel.cvut.cz>"
+!
+
+send: selector numArgs: numArgs toSuperOf: behavior
+
+        self add: (IRInstruction send: selector numArgs: numArgs toSuperOf: behavior)
+
+    "Created: / 01-12-2008 / 19:56:20 / Jan Vrany <vranyj1@fel.cvut.cz>"
+!
+
 send: selector toSuperOf: behavior
 
 	self add: (IRInstruction send: selector toSuperOf: behavior)
--- a/IRBuilderTest.st	Wed Nov 05 18:58:44 2008 +0000
+++ b/IRBuilderTest.st	Mon Dec 01 19:01:08 2008 +0000
@@ -19,6 +19,15 @@
 	TestToPush := anObject
 ! !
 
+!IRBuilderTest methodsFor:'mock methods'!
+
+mock1: arg1 with: arg2
+
+    ^arg1 + arg2
+
+    "Created: / 01-12-2008 / 19:59:11 / Jan Vrany <vranyj1@fel.cvut.cz>"
+! !
+
 !IRBuilderTest methodsFor:'testing'!
 
 halt
@@ -506,6 +515,63 @@
     "Modified: / 11-06-2008 / 14:47:36 / Jan Vrany <vranyj1@fel.cvut.cz>"
 !
 
+testSendNumArgs1
+
+        | iRMethod aCompiledMethod  |
+        iRMethod := IRBuilder new
+                numRargs: 1;
+                addTemps: #(self);              "receiver and args declarations"
+        
+                pushReceiver;
+                pushLiteral: 1;
+                pushLiteral: 2;
+                send: #mock1 numArgs:2;
+                returnTop;
+                ir.
+
+        aCompiledMethod := iRMethod compiledMethod.
+        self class 
+            basicAddSelector: #mock1 withMethod: (self class >> #mock1:with:).
+
+        self assert: (aCompiledMethod isKindOf: CompiledMethod).
+        self assert: (aCompiledMethod valueWithReceiver: (IRBuilderTest new) arguments:#())
+                        = 3.
+
+        self class 
+            basicRemoveSelector: #mock1.
+
+    "Created: / 01-12-2008 / 19:58:18 / Jan Vrany <vranyj1@fel.cvut.cz>"
+!
+
+testSendNumArgs2
+
+        | iRMethod aCompiledMethod  |
+        iRMethod := IRBuilder new
+                numRargs: 1;
+                addTemps: #(self);              "receiver and args declarations"
+        
+                pushReceiver;
+                pushLiteral: 1;
+                send: #mock1 numArgs:1;
+                returnTop;
+                ir.
+
+        aCompiledMethod := iRMethod compiledMethod.
+        self class 
+            basicAddSelector: #mock1 withMethod: (self class >> #mock1:with:).
+
+        self assert: (aCompiledMethod isKindOf: CompiledMethod).
+        self 
+            should: [(aCompiledMethod valueWithReceiver: (IRBuilderTest new) arguments:#())]
+            raise: Error.
+
+
+        self class 
+            basicRemoveSelector: #mock1.
+
+    "Created: / 01-12-2008 / 19:59:02 / Jan Vrany <vranyj1@fel.cvut.cz>"
+!
+
 testSendSuper
 
         | iRMethod aCompiledMethod  |
--- a/IRBytecodeGenerator.st	Wed Nov 05 18:58:44 2008 +0000
+++ b/IRBytecodeGenerator.st	Mon Dec 01 19:01:08 2008 +0000
@@ -282,33 +282,33 @@
     "Modified: / 11-06-2008 / 14:04:55 / Jan Vrany <vranyj1@fel.cvut.cz>"
 !
 
-send: selector
+send: selector numArgs: sendNumArgs
 
-        stack pop: selector numArgs.
+        stack pop: sendNumArgs.
 
 
         self 
             nextPut: #send;
             nextPut: 0; "lineno"
             nextPut: (self addLiteral: selector);
-            nextPut: selector numArgs.
+            nextPut: sendNumArgs.
 
-    "Modified: / 11-06-2008 / 14:16:58 / Jan Vrany <vranyj1@fel.cvut.cz>"
+    "Created: / 01-12-2008 / 19:47:43 / Jan Vrany <vranyj1@fel.cvut.cz>"
 !
 
-send: selector toSuperOf: behavior
+send: selector numArgs: sendNumArgs toSuperOf: behavior
 
-        stack pop: selector numArgs.
+        stack pop: sendNumArgs.
 
 
         self 
             nextPut: #superSend;
             nextPut: 0; "lineno"
             nextPut: (self addLiteral: selector);
-            nextPut: selector numArgs;
+            nextPut: sendNumArgs;
             nextPut: (self addLiteral: behavior superclass)
 
-    "Modified: / 11-06-2008 / 16:10:34 / Jan Vrany <vranyj1@fel.cvut.cz>"
+    "Created: / 01-12-2008 / 19:48:14 / Jan Vrany <vranyj1@fel.cvut.cz>"
 !
 
 storeInstVar: index
--- a/IRDecompiler.st	Wed Nov 05 18:58:44 2008 +0000
+++ b/IRDecompiler.st	Mon Dec 01 19:01:08 2008 +0000
@@ -220,43 +220,47 @@
 	self goto: #return.
 !
 
-send: selector
+send: selector numArgs: numArgs
+
+        | args rcvr |
+        selector = #caseError ifTrue:[^self stackPush: (RBPseudoSendNode new selector: selector)].
+        args := OrderedCollection new.
+        [       selector numArgs timesRepeat: [args addFirst: self Value].
+                rcvr := self Value.
+        ] on: Abort do: [
+                [self stackPush: (RBPseudoSendNode new selector: selector).
+                ^self cascade] on: Abort do:[^false]
+        ].
 
-	| args rcvr |
-	selector = #caseError ifTrue:[^self stackPush: (RBPseudoSendNode new selector: selector)].
-	args := OrderedCollection new.
-	[	selector numArgs timesRepeat: [args addFirst: self Value].
-		rcvr := self Value.
-	] on: Abort do: [
-		[self stackPush: (RBPseudoSendNode new selector: selector).
-		^self cascade] on: Abort do:[^false]
-	].
+        Preferences compileBlocksAsClosures 
+                        ifTrue: [ (rcvr isLiteral and: [selector = #createBlock:]) ifTrue: [
+                                         ^ self block: rcvr value env: args first]]
+                        ifFalse: [ (selector = #blockCopy:) ifTrue: [
+                                         ^ self stackPush: (RBPseudoSendNode new selector: selector; arguments: args)]].
 
-	Preferences compileBlocksAsClosures 
-			ifTrue: [ (rcvr isLiteral and: [selector = #createBlock:]) ifTrue: [
-					 ^ self block: rcvr value env: args first]]
-			ifFalse: [ (selector = #blockCopy:) ifTrue: [
-					 ^ self stackPush: (RBPseudoSendNode new selector: selector; arguments: args)]].
+        self stackPush: (self simplify: (RBMessageNode new
+                receiver: rcvr
+                selectorParts: (self newSelectorParts: selector)
+                arguments: args)).
 
-	self stackPush: (self simplify: (RBMessageNode new
-		receiver: rcvr
-		selectorParts: (self newSelectorParts: selector)
-		arguments: args)).
+    "Created: / 01-12-2008 / 19:40:52 / Jan Vrany <vranyj1@fel.cvut.cz>"
 !
 
-send: selector toSuperOf: behavior
+send: selector numArgs: numArgs toSuperOf: behavior
+
+        | args rcvr |
+        args := OrderedCollection new.
+        selector numArgs timesRepeat: [args addFirst: self Value].
+        rcvr := self Value.
+        (rcvr isVariable and: [rcvr name = 'self']) ifFalse: [self patternError].
 
-	| args rcvr |
-	args _ OrderedCollection new.
-	selector numArgs timesRepeat: [args addFirst: self Value].
-	rcvr _ self Value.
-	(rcvr isVariable and: [rcvr name = 'self']) ifFalse: [self patternError].
+        rcvr identifierToken: (SqueakToken value: 'super' start: 0).
+        self stackPush: (RBMessageNode new
+                receiver: rcvr
+                selectorParts: (self newSelectorParts: selector)
+                arguments: args).
 
-	rcvr identifierToken: (SqueakToken value: 'super' start: 0).
-	self stackPush: (RBMessageNode new
-		receiver: rcvr
-		selectorParts: (self newSelectorParts: selector)
-		arguments: args).
+    "Created: / 01-12-2008 / 19:45:52 / Jan Vrany <vranyj1@fel.cvut.cz>"
 !
 
 storeIntoLiteralVariable: association
--- a/IRInstruction.st	Wed Nov 05 18:58:44 2008 +0000
+++ b/IRInstruction.st	Mon Dec 01 19:01:08 2008 +0000
@@ -105,6 +105,26 @@
 		selector: selector
 !
 
+send: selector numArgs: numArgs
+
+        ^ IRSend new
+                selector: selector;
+                numArgs: numArgs
+
+    "Created: / 01-12-2008 / 19:56:55 / Jan Vrany <vranyj1@fel.cvut.cz>"
+!
+
+send: selector numArgs: numArgs toSuperOf: behavior
+
+        behavior ifNil: [self error: 'super of nil does not exist'].
+        ^ IRSend new
+                selector: selector;
+                numArgs: numArgs;
+                superOf: behavior
+
+    "Created: / 01-12-2008 / 19:57:06 / Jan Vrany <vranyj1@fel.cvut.cz>"
+!
+
 send: selector toSuperOf: behavior
 
 	behavior ifNil: [self error: 'super of nil does not exist'].
--- a/IRInterpreter.st	Wed Nov 05 18:58:44 2008 +0000
+++ b/IRInterpreter.st	Mon Dec 01 19:01:08 2008 +0000
@@ -58,10 +58,14 @@
 returnTop
 !
 
-send: selector
+send: selector numArgs: numArgs
+
+    "Created: / 01-12-2008 / 19:40:01 / Jan Vrany <vranyj1@fel.cvut.cz>"
 !
 
-send: selector toSuperOf: behavior
+send: selector numArgs: numArgs toSuperOf: behavior
+
+    "Modified: / 01-12-2008 / 19:45:19 / Jan Vrany <vranyj1@fel.cvut.cz>"
 !
 
 storeLiteralVariable: index
--- a/IRPrinter.st	Wed Nov 05 18:58:44 2008 +0000
+++ b/IRPrinter.st	Mon Dec 01 19:01:08 2008 +0000
@@ -136,18 +136,26 @@
 	stream nextPutAll: 'returnTop'.
 !
 
-send: selector
+send: selector numArgs: numArgs
 
-	stream nextPutAll: 'send: '.
-	selector printOn: stream.
+        stream nextPutAll: 'send: '.
+        selector printOn: stream.
+        stream nextPutAll: ' numArgs: '.
+        numArgs printOn: stream.
+
+    "Created: / 01-12-2008 / 19:41:52 / Jan Vrany <vranyj1@fel.cvut.cz>"
 !
 
-send: selector toSuperOf: behavior
+send: selector numArgs: numArgs toSuperOf: behavior
 
-	stream nextPutAll: 'send: '.
-	selector printOn: stream.
-	stream nextPutAll: ' toSuperOf: '.
-	behavior printOn: stream.
+        stream nextPutAll: 'send: '.
+        selector printOn: stream.
+        stream nextPutAll: ' numArgs: '.
+        numArgs printOn: stream.
+        stream nextPutAll: ' toSuperOf: '.
+        behavior printOn: stream.
+
+    "Created: / 01-12-2008 / 19:46:28 / Jan Vrany <vranyj1@fel.cvut.cz>"
 !
 
 storeTemp: index
--- a/IRSend.st	Wed Nov 05 18:58:44 2008 +0000
+++ b/IRSend.st	Mon Dec 01 19:01:08 2008 +0000
@@ -1,7 +1,7 @@
 "{ Package: 'stx:goodies/newcompiler' }"
 
 IRInstruction subclass:#IRSend
-	instanceVariableNames:'selector superOf'
+	instanceVariableNames:'selector numArgs superOf'
 	classVariableNames:''
 	poolDictionaries:''
 	category:'NewCompiler-IR'
@@ -13,6 +13,18 @@
 
 !IRSend methodsFor:'accessing'!
 
+numArgs
+    ^ numArgs
+
+    "Created: / 01-12-2008 / 19:33:49 / Jan Vrany <vranyj1@fel.cvut.cz>"
+!
+
+numArgs:anInteger
+    numArgs := anInteger.
+
+    "Created: / 01-12-2008 / 19:33:49 / Jan Vrany <vranyj1@fel.cvut.cz>"
+!
+
 selector
 	^selector
 !
@@ -40,9 +52,13 @@
 
 executeOn: interpreter
 
-	^ superOf
-		ifNil: [interpreter send: selector]
-		ifNotNil: [interpreter send: selector toSuperOf: superOf]
+    numArgs ifNil:[numArgs := selector numArgs].
+
+    ^ superOf
+        ifNil: [interpreter send: selector numArgs: numArgs]
+        ifNotNil: [interpreter send: selector numArgs: numArgs toSuperOf: superOf ]
+
+    "Modified: / 01-12-2008 / 19:39:51 / Jan Vrany <vranyj1@fel.cvut.cz>"
 ! !
 
 !IRSend methodsFor:'testing'!
--- a/IRTranslator.st	Wed Nov 05 18:58:44 2008 +0000
+++ b/IRTranslator.st	Mon Dec 01 19:01:08 2008 +0000
@@ -172,40 +172,44 @@
 	gen returnTop.
 !
 
-send: selector
+send: selector numArgs: numArgs
 
-	"If get/set inst var, access it directly"
-	| index |
-	
-	((#(privGetInstVar: #privStoreIn:instVar:) identityIncludes: selector) and:
-	 [self pendingMatches: {
-		[:m | m selector == #pushReceiver].
-		[:m | m selector == #pushLiteral: and: [m argument isInteger]]}]
-	) ifTrue: [
-		index _ self popPending argument.
-		self popPending.  "pop pushReceiver"
-		self addPending: (Message
-			selector: (selector == #privGetInstVar:
-				ifTrue: [#pushInstVar:] ifFalse: [#storeInstVar:])
-			argument: index).
-		(self pendingMatches: {
-			[:m | m selector == #storePopInstVar: and: [m argument = index]].
-			[:m | m selector == #pushInstVar: and: [m argument = index]]}
-		) ifTrue: [
-			self popPending.
-			self pendingSelector: #storeInstVar:.
-		].
-		^ self
-	].
-	"otherwise do normal send"
-	self doPending.
-	gen send: selector.
+        "If get/set inst var, access it directly"
+        | index |
+        
+        ((#(privGetInstVar: #privStoreIn:instVar:) identityIncludes: selector) and:
+         [self pendingMatches: (Array 
+                with:[:m | m selector == #pushReceiver]
+                with:[:m | m selector == #pushLiteral: and: [m argument isInteger]])]
+        ) ifTrue: [
+                index := self popPending argument.
+                self popPending.  "pop pushReceiver"
+                self addPending: (Message
+                        selector: (selector == #privGetInstVar:
+                                ifTrue: [#pushInstVar:] ifFalse: [#storeInstVar:])
+                        argument: index).
+                (self pendingMatches: (Array
+                        with:[:m | m selector == #storePopInstVar: and: [m argument = index]]
+                        with:[:m | m selector == #pushInstVar: and: [m argument = index]])
+                ) ifTrue: [
+                        self popPending.
+                        self pendingSelector: #storeInstVar:.
+                ].
+                ^ self
+        ].
+        "otherwise do normal send"
+        self doPending.
+        gen send: selector numArgs: numArgs
+
+    "Created: / 01-12-2008 / 19:44:32 / Jan Vrany <vranyj1@fel.cvut.cz>"
 !
 
-send: selector toSuperOf: behavior
+send: selector numArgs: numArgs toSuperOf: behavior
 
-	self doPending.
-	gen send: selector toSuperOf: behavior.
+        self doPending.
+        gen send: selector numArgs: numArgs toSuperOf: behavior.
+
+    "Created: / 01-12-2008 / 19:46:42 / Jan Vrany <vranyj1@fel.cvut.cz>"
 !
 
 storeInstVar: index 
--- a/stx_goodies_newcompiler.st	Wed Nov 05 18:58:44 2008 +0000
+++ b/stx_goodies_newcompiler.st	Mon Dec 01 19:01:08 2008 +0000
@@ -22,7 +22,7 @@
         #'stx:libwidg'    "ScrollableView - referenced by IRMethod>>inspector2TabIRCode "
     )
 
-    "Modified: / 05-11-2008 / 19:52:40 / Jan Vrany <vranyj1@fel.cvut.cz>"
+    "Modified: / 01-12-2008 / 19:59:45 / Jan Vrany <vranyj1@fel.cvut.cz>"
 ! !
 
 !stx_goodies_newcompiler class methodsFor:'description - contents'!
@@ -64,7 +64,7 @@
         IRTempStore
     )
 
-    "Modified: / 05-11-2008 / 19:52:39 / Jan Vrany <vranyj1@fel.cvut.cz>"
+    "Modified: / 01-12-2008 / 19:59:44 / Jan Vrany <vranyj1@fel.cvut.cz>"
 !
 
 extensionMethodNames
@@ -74,7 +74,7 @@
         Class bindingOf:
     )
 
-    "Modified: / 05-11-2008 / 19:52:39 / Jan Vrany <vranyj1@fel.cvut.cz>"
+    "Modified: / 01-12-2008 / 19:59:44 / Jan Vrany <vranyj1@fel.cvut.cz>"
 ! !
 
 !stx_goodies_newcompiler class methodsFor:'description - project information'!