Added method IRBuilder>>#send:numArgs and IRBuilder>>#send:numArgs:toSuperOf:.
Those methods will be used by the Ruby compiler
--- 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'!