diff -r de981640a2ec -r 0dd36941955f IRBuilderTest.st --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/IRBuilderTest.st Wed Jun 11 14:54:42 2008 +0000 @@ -0,0 +1,608 @@ +"{ Package: 'stx:goodies/newcompiler' }" + +TestCase subclass:#IRBuilderTest + instanceVariableNames:'' + classVariableNames:'TestToPush' + poolDictionaries:'' + category:'NewCompiler-IR-Tests' +! + + +!IRBuilderTest class methodsFor:'as yet unclassified'! + +testToPush + ^TestToPush +! + +testToPush: anObject + + TestToPush := anObject +! ! + +!IRBuilderTest methodsFor:'testing'! + +halt + "Redefinition for testing the #send:toSuperOf:" + + "Created: / 11-06-2008 / 16:08:52 / Jan Vrany " +! + +isThisEverCalled + "Redefinition for testing the #send:toSuperOf:" +! + +testDup + + | iRMethod aCompiledMethod | + iRMethod := IRBuilder new + numRargs: 1; + addTemps: #(self); "receiver and args declarations" + + pushLiteral: 3; + pushDup; + + send: #=; + + returnTop; + ir. + + aCompiledMethod := iRMethod compiledMethod. + + self assert: (aCompiledMethod isKindOf: CompiledMethod). + self assert: ((aCompiledMethod valueWithReceiver: nil arguments: #() ) = true). + +! + +testInstVar + + | aCompiledMethod irBuilder | + irBuilder := IRBuilder new + numRargs: 1; + addTemps: #(self); "receiver and args declarations" + + pushInstVar: 1; + pushInstVar: 2; + send: #+; + + returnTop; + ir. + + aCompiledMethod := irBuilder compiledMethod. + + self assert: (aCompiledMethod isKindOf: CompiledMethod). + self assert: ((aCompiledMethod valueWithReceiver: (3@4) arguments: #() ) = 7). + + "Modified: / 11-06-2008 / 13:16:41 / Jan Vrany " +! + +testJumpAheadTo + + | iRMethod aCompiledMethod | + iRMethod := IRBuilder new + numRargs: 1; + addTemps: #(self); "receiver and args declarations" + pushTemp: #self ; + + jumpAheadTo: #end; + pushLiteral: 3; + jumpAheadTarget: #end; + + returnTop; + ir. + + aCompiledMethod := iRMethod compiledMethod. + + self assert: (aCompiledMethod isKindOf: CompiledMethod). + self assert: ((aCompiledMethod valueWithReceiver: nil arguments: #() ) = nil). + +! + +testJumpAheadToIf + + | iRMethod aCompiledMethod | + iRMethod := IRBuilder new + numRargs: 1; + addTemps: #(self); "receiver and args declarations" + pushTemp: #self ; + pushLiteral: true; + + "jumpAhaedTo pop the first element of thz stack" + jumpAheadTo: #end if: true; + pushLiteral: 3; + jumpAheadTarget: #end; + + returnTop; + ir. + + aCompiledMethod := iRMethod compiledMethod. + + self assert: (aCompiledMethod isKindOf: CompiledMethod). + self assert: ((aCompiledMethod valueWithReceiver: nil arguments: #() ) = nil). + +! + +testJumpBackTo + + | iRMethod aCompiledMethod | + iRMethod := IRBuilder new + numRargs: 1; + addTemps: #(self); "receiver and args declarations" + pushTemp: #self ; + pushLiteral: false; + jumpBackTarget: #begin; + + "jumpAhaedTo pop the first element of the stack" + jumpAheadTo: #end if: true; + pushLiteral: true; + jumpBackTo: #begin; + jumpAheadTarget: #end; + + returnTop; + ir. + + aCompiledMethod := iRMethod compiledMethod. + + self assert: (aCompiledMethod isKindOf: CompiledMethod). + self assert: ((aCompiledMethod valueWithReceiver: nil arguments: #() ) = nil). + +! + +testLiteralArray + + | iRMethod aCompiledMethod | + iRMethod := IRBuilder new + numRargs: 1; + addTemps: #(self); "receiver and args declarations" + + pushLiteral: #(test 4 you); + returnTop; + ir. + + aCompiledMethod := iRMethod compiledMethod. + + self assert: (aCompiledMethod isKindOf: CompiledMethod). + self assert: ((aCompiledMethod valueWithReceiver: nil arguments: #() ) = #(test 4 you)). + + +! + +testLiteralBoolean + + | iRMethod aCompiledMethod | + iRMethod := IRBuilder new + numRargs: 1; + addTemps: #(self); "receiver and args declarations" + + pushLiteral: true; + returnTop; + ir. + + aCompiledMethod := iRMethod compiledMethod. + + self assert: (aCompiledMethod isKindOf: CompiledMethod). + self assert: ((aCompiledMethod valueWithReceiver: nil arguments: #() ) = true). + + +! + +testLiteralCharacter + + | iRMethod aCompiledMethod | + iRMethod := IRBuilder new + numRargs: 1; + addTemps: #(self); "receiver and args declarations" + + pushLiteral: $e; + returnTop; + ir. + + aCompiledMethod := iRMethod compiledMethod. + + self assert: (aCompiledMethod isKindOf: CompiledMethod). + self assert: ((aCompiledMethod valueWithReceiver: nil arguments: #() ) = $e). + + +! + +testLiteralFloat + + | iRMethod aCompiledMethod | + iRMethod := IRBuilder new + numRargs: 1; + addTemps: #(self); "receiver and args declarations" + + pushLiteral: 2.0; + returnTop; + ir. + + aCompiledMethod := iRMethod compiledMethod. + + self assert: (aCompiledMethod isKindOf: CompiledMethod). + self assert: ((aCompiledMethod valueWithReceiver: nil arguments: #() ) = 2.0). + + +! + +testLiteralInteger + + | iRMethod aCompiledMethod | + iRMethod := IRBuilder new + numRargs: 1; + addTemps: #(self); "receiver and args declarations" + + pushLiteral: 2; + returnTop; + ir. + + aCompiledMethod := iRMethod compiledMethod. + + self assert: (aCompiledMethod isKindOf: CompiledMethod). + self assert: ((aCompiledMethod valueWithReceiver: nil arguments: #() ) = 2). + + +! + +testLiteralNil + + | iRMethod aCompiledMethod | + iRMethod := IRBuilder new + numRargs: 1; + addTemps: #(self); "receiver and args declarations" + + pushLiteral: nil; + returnTop; + ir. + + aCompiledMethod := iRMethod compiledMethod. + + self assert: (aCompiledMethod isKindOf: CompiledMethod). + self assert: ((aCompiledMethod valueWithReceiver: 4 arguments: #() ) = nil). + + +! + +testLiteralString + + | iRMethod aCompiledMethod | + iRMethod := IRBuilder new + numRargs: 1; + addTemps: #(self); "receiver and args declarations" + + pushLiteral: 'hello'; + returnTop; + ir. + + aCompiledMethod := iRMethod compiledMethod. + + self assert: (aCompiledMethod isKindOf: CompiledMethod). + self assert: ((aCompiledMethod valueWithReceiver: nil arguments: #() ) = 'hello'). + + +! + +testLiteralSymbole + + | iRMethod aCompiledMethod | + iRMethod := IRBuilder new + numRargs: 1; + addTemps: #(self); "receiver and args declarations" + + pushLiteral: #you; + returnTop; + ir. + + aCompiledMethod := iRMethod compiledMethod. + + self assert: (aCompiledMethod isKindOf: CompiledMethod). + self assert: ((aCompiledMethod valueWithReceiver: nil arguments: #() ) = #you). + + +! + +testLiteralVariableClass + + | iRMethod aCompiledMethod | + iRMethod := IRBuilder new + numRargs: 1; + addTemps: #(self); "receiver and args declarations" + + pushLiteralVariable: Object binding; + returnTop; + ir. + + aCompiledMethod := iRMethod compiledMethod. + + self assert: (aCompiledMethod isKindOf: CompiledMethod). + self assert: ((aCompiledMethod valueWithReceiver: nil arguments: #() ) = Object). + + +! + +testLiteralVariableClassVariable + + | iRMethod aCompiledMethod | + iRMethod := IRBuilder new + numRargs: 1; + addTemps: #(self); "receiver and args declarations" + + pushLiteralVariable: (ArithmeticValue bindingOf: #ArithmeticSignal); + returnTop; + ir. + + aCompiledMethod := iRMethod compiledMethod. + + self assert: (aCompiledMethod isKindOf: CompiledMethod). + self assert: ((aCompiledMethod valueWithReceiver: nil arguments: #() ) = ArithmeticValue arithmeticSignal). + + "Modified: / 11-06-2008 / 11:31:32 / Jan Vrany " +! + +testLiteralVariableGlobale + + | iRMethod aCompiledMethod | + iRMethod := IRBuilder new + numRargs: 1; + addTemps: #(self); "receiver and args declarations" + + pushLiteralVariable: Smalltalk binding; + returnTop; + ir. + + aCompiledMethod := iRMethod compiledMethod. + + self assert: (aCompiledMethod isKindOf: CompiledMethod). + self assert: ((aCompiledMethod valueWithReceiver: nil arguments: #() ) = Smalltalk). + + "Modified: / 11-06-2008 / 11:32:07 / Jan Vrany " +! + +testPopTop + + | iRMethod aCompiledMethod | + iRMethod := IRBuilder new + numRargs: 1; + addTemps: #(self); "receiver and args declarations" + pushLiteral: true ; + + pushLiteral: false; + popTop; + + returnTop; + ir. + + aCompiledMethod := iRMethod compiledMethod. + + self assert: (aCompiledMethod isKindOf: CompiledMethod). + self assert: ((aCompiledMethod valueWithReceiver: nil arguments: #() ) = true). + + "Modified: / 11-06-2008 / 13:22:11 / Jan Vrany " +! + +testPushReceiver + + | iRMethod aCompiledMethod receiver | + iRMethod := IRBuilder new + numRargs: 1; + addTemps: #(self); "receiver and args declarations" + pushReceiver; + returnTop; + ir. + + aCompiledMethod := iRMethod compiledMethod. + + receiver := (5@8). + + self assert: (aCompiledMethod isKindOf: CompiledMethod). + self assert: ((aCompiledMethod valueWithReceiver: receiver arguments: #() ) == receiver). +! + +testPushTempArgument + + | iRMethod aCompiledMethod | + iRMethod := IRBuilder new + numRargs: 3; + addTemps: #(self a b); "receiver and args declarations" + pushTemp: #a; + pushTemp: #b; + send: #+; + returnTop; + ir. + + aCompiledMethod := iRMethod compiledMethod. + + + self assert: (aCompiledMethod isKindOf: CompiledMethod). + self assert: ((aCompiledMethod valueWithReceiver: nil arguments: #(2 8) ) = 10). + +! + +testPushTempSelf + + | iRMethod aCompiledMethod | + iRMethod := IRBuilder new + numRargs: 1; + addTemps: #(self); "receiver and args declarations" + pushTemp: #self; + send: #class; + returnTop; + ir. + + aCompiledMethod := iRMethod compiledMethod. + + + self assert: (aCompiledMethod isKindOf: CompiledMethod). + self assert: ((aCompiledMethod valueWithReceiver: nil arguments: #() ) == UndefinedObject). + +! + +testPushTempTemp + + | iRMethod aCompiledMethod | + iRMethod := IRBuilder new + numRargs: 1; + addTemps: #(self a); "receiver and args declarations" + + pushTemp: #a; + + returnTop; + ir. + + aCompiledMethod := iRMethod compiledMethod. + + + self assert: (aCompiledMethod isKindOf: CompiledMethod). + self assert: ((aCompiledMethod valueWithReceiver: 5 arguments: #() ) = nil). + +! + +testPushThisContext + + | iRMethod aCompiledMethod | + iRMethod := IRBuilder new + numRargs: 1; + addTemps: #(self a); "receiver and args declarations" + + pushThisContext; + send: #receiver; + + returnTop; + ir. + + aCompiledMethod := iRMethod compiledMethod. + + + self assert: (aCompiledMethod isKindOf: CompiledMethod). + self assert: ((aCompiledMethod valueWithReceiver: 5 arguments: #() ) = 5). + +! + +testPushThisEnv + + | iRMethod aCompiledMethod receiver | + + ^self. + + + iRMethod := IRBuilder new + numRargs: 1; + addTemps: #(self); "receiver and args declarations" + pushThisContext; + pushLiteral: 5; + pushLiteral: ClosureEnvironment; + pushLiteral: 1; + send: #new:; + send: #privSetInstVar:put:; + pushThisEnv; + returnTop; + ir. + + aCompiledMethod := iRMethod compiledMethod. + + receiver := Object new. + + self assert: (aCompiledMethod isKindOf: CompiledMethod). + self assert: ((aCompiledMethod valueWithReceiver: receiver arguments: #()) isKindOf: ClosureEnvironment) + + "Modified: / 11-06-2008 / 14:47:36 / Jan Vrany " +! + +testSendSuper + + | iRMethod aCompiledMethod | + iRMethod := IRBuilder new + numRargs: 1; + addTemps: #(self); "receiver and args declarations" + + pushReceiver; + send: #halt toSuperOf: IRBuilderTest; + + returnTop; + ir. + + aCompiledMethod := iRMethod compiledMethod. + + + self assert: (aCompiledMethod isKindOf: CompiledMethod). + self should: [(aCompiledMethod valueWithReceiver: (IRBuilderTest new) arguments: #())] raise: Error. + + "Modified: / 11-06-2008 / 16:09:12 / Jan Vrany " +! + +testStorIntoVariable + + | iRMethod aCompiledMethod | + iRMethod := IRBuilder new + numRargs: 1; + addTemps: #(self); "receiver and args declarations" + + pushLiteral: 4; + storeIntoLiteralVariable: (IRBuilderTest bindingOf: #TestToPush); + + returnTop; + ir. + + aCompiledMethod := iRMethod compiledMethod. + + + self assert: (aCompiledMethod isKindOf: CompiledMethod). + aCompiledMethod valueWithReceiver: nil arguments: #(). + self assert: (IRBuilderTest testToPush = 4). + IRBuilderTest testToPush: nil. + + +! + +testStoreTemp + + | iRMethod aCompiledMethod | + iRMethod := IRBuilder new + numRargs: 1; + addTemps: #(self a); "receiver and args declarations" + + pushLiteral: 34; + storeTemp: #a; + pushTemp: #a; + + returnTop; + ir. + + aCompiledMethod := iRMethod compiledMethod. + + self assert: (aCompiledMethod isKindOf: CompiledMethod). + self assert: ((aCompiledMethod valueWithReceiver: nil arguments: #() ) = 34). + + "Modified: / 11-06-2008 / 16:24:43 / Jan Vrany " +! + +testStoreThisEnv + + | iRMethod aCompiledMethod | + + ^self. + + iRMethod := IRBuilder new + numRargs: 1; + addTemps: #(self a); "receiver and args declarations" + pushLiteral: ClosureEnvironment; + pushLiteral: 1; + send: #new:; + storeThisEnv; + pushThisContext; + pushLiteral: 5; + send: #privGetInstVar:; + returnTop; + ir. + + aCompiledMethod := iRMethod compiledMethod. + + self assert: (aCompiledMethod isKindOf: CompiledMethod). + self assert: ((aCompiledMethod valueWithReceiver: nil arguments: #() ) isKindOf: ClosureEnvironment). + + "Modified: / 11-06-2008 / 14:47:51 / Jan Vrany " +! ! + +!IRBuilderTest class methodsFor:'documentation'! + +version + ^'$Id$' +! !