# HG changeset patch # User Jan Vrany # Date 1228158068 0 # Node ID b94aea1d371017ed0423ef30a199c09319ca0266 # Parent 7195866510e105e2bb741078091244373fa3a2fe Added method IRBuilder>>#send:numArgs and IRBuilder>>#send:numArgs:toSuperOf:. Those methods will be used by the Ruby compiler diff -r 7195866510e1 -r b94aea1d3710 IRBuilder.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 " +! + +send: selector numArgs: numArgs toSuperOf: behavior + + self add: (IRInstruction send: selector numArgs: numArgs toSuperOf: behavior) + + "Created: / 01-12-2008 / 19:56:20 / Jan Vrany " +! + send: selector toSuperOf: behavior self add: (IRInstruction send: selector toSuperOf: behavior) diff -r 7195866510e1 -r b94aea1d3710 IRBuilderTest.st --- 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 " +! ! + !IRBuilderTest methodsFor:'testing'! halt @@ -506,6 +515,63 @@ "Modified: / 11-06-2008 / 14:47:36 / Jan Vrany " ! +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 " +! + +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 " +! + testSendSuper | iRMethod aCompiledMethod | diff -r 7195866510e1 -r b94aea1d3710 IRBytecodeGenerator.st --- 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 " ! -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 " + "Created: / 01-12-2008 / 19:47:43 / Jan Vrany " ! -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 " + "Created: / 01-12-2008 / 19:48:14 / Jan Vrany " ! storeInstVar: index diff -r 7195866510e1 -r b94aea1d3710 IRDecompiler.st --- 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 " ! -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 " ! storeIntoLiteralVariable: association diff -r 7195866510e1 -r b94aea1d3710 IRInstruction.st --- 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 " +! + +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 " +! + send: selector toSuperOf: behavior behavior ifNil: [self error: 'super of nil does not exist']. diff -r 7195866510e1 -r b94aea1d3710 IRInterpreter.st --- 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 " ! -send: selector toSuperOf: behavior +send: selector numArgs: numArgs toSuperOf: behavior + + "Modified: / 01-12-2008 / 19:45:19 / Jan Vrany " ! storeLiteralVariable: index diff -r 7195866510e1 -r b94aea1d3710 IRPrinter.st --- 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 " ! -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 " ! storeTemp: index diff -r 7195866510e1 -r b94aea1d3710 IRSend.st --- 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 " +! + +numArgs:anInteger + numArgs := anInteger. + + "Created: / 01-12-2008 / 19:33:49 / Jan Vrany " +! + 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 " ! ! !IRSend methodsFor:'testing'! diff -r 7195866510e1 -r b94aea1d3710 IRTranslator.st --- 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 " ! -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 " ! storeInstVar: index diff -r 7195866510e1 -r b94aea1d3710 stx_goodies_newcompiler.st --- 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 " + "Modified: / 01-12-2008 / 19:59:45 / Jan Vrany " ! ! !stx_goodies_newcompiler class methodsFor:'description - contents'! @@ -64,7 +64,7 @@ IRTempStore ) - "Modified: / 05-11-2008 / 19:52:39 / Jan Vrany " + "Modified: / 01-12-2008 / 19:59:44 / Jan Vrany " ! extensionMethodNames @@ -74,7 +74,7 @@ Class bindingOf: ) - "Modified: / 05-11-2008 / 19:52:39 / Jan Vrany " + "Modified: / 01-12-2008 / 19:59:44 / Jan Vrany " ! ! !stx_goodies_newcompiler class methodsFor:'description - project information'!