tests/IRBuilderTest.st
changeset 44 840c68a91cdd
child 46 2fb37cf149fb
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/IRBuilderTest.st	Thu Oct 30 22:27:09 2014 +0000
@@ -0,0 +1,1031 @@
+"{ Package: 'ctu:ircompiler/tests' }"
+
+TestCase subclass:#IRBuilderTest
+	instanceVariableNames:''
+	classVariableNames:'TestToPush'
+	poolDictionaries:''
+	category:'IR Compiler-Tests'
+!
+
+
+!IRBuilderTest class methodsFor:'as yet unclassified'!
+
+testToPush
+	^TestToPush
+!
+
+testToPush: anObject
+
+	TestToPush := anObject
+! !
+
+!IRBuilderTest methodsFor:'mock methods'!
+
+mock1: arg1 with: arg2
+
+    ^arg1 + arg2
+
+    "Created: / 02-12-2008 / 09:11:46 / Jan Vrany <vranyj1@fel.cvut.cz>"
+!
+
+mock2
+
+    ^[ testSelector ]
+
+    "
+    decompiling IRBuilderTest>>mock2
+    nA: 0 nV: 0 nT: 2   
+    
+    1: 37 04 00 00             makeBlock 4 (7) nv=0 na=0
+    5: 5A                      pushInstVar1
+    6: 00                      retTop
+    7: 08 03                   LINE[3]
+    9: 00                      retTop
+    "
+
+    "Created: / 28-03-2009 / 18:47:17 / Jan Vrany <vranyj1@fel.cvut.cz>"
+    "Modified: / 28-03-2009 / 20:16:08 / Jan Vrany <vranyj1@fel.cvut.cz>"
+!
+
+mock3
+    | b |
+    b := 1.
+    ^[ b ]
+
+    "
+    decompiling IRBuilderTest>>mock3
+    nA: 0 nV: 1 nT: 2
+
+    1: 79                      push1
+    2: 64                      storeMethodVar1
+    3: 37 04 00 00             makeBlock 4 (9) nv=0 na=0
+    7: 50                      pushMethodVar1
+    8: 00                      retTop
+    9: 08 04                   LINE[4]
+    11:00                      retTop
+    "
+
+    "Created: / 28-03-2009 / 20:16:36 / Jan Vrany <vranyj1@fel.cvut.cz>"
+!
+
+mock4
+
+    ^[:arg| arg ]
+
+    "
+    decompiling IRBuilderTest>>mock4
+    nA: 0 nV: 0 nT: 2
+
+    1: 37 04 00 01             makeBlock 4 (7) nv=0 na=1
+    5: 8C                      pushBlockArg1
+    6: 00                      retTop
+    7: 08 03                   LINE[3]
+    9: 00                      retTop
+
+
+
+    "
+
+    "Created: / 28-03-2009 / 20:18:32 / Jan Vrany <vranyj1@fel.cvut.cz>"
+!
+
+mock5
+
+    ^[|temp| temp ]
+
+    "
+    decompiling IRBuilderTest>>mock5
+    nA: 0 nV: 0 nT: 2
+    
+    1: 37 04 01 00             makeBlock 4 (7) nv=1 na=0
+    5: E8                      pushBlockVar1
+    6: 00                      retTop
+    7: 08 03                   LINE[3]
+    9: 00                      retTop
+    "
+
+    "Created: / 28-03-2009 / 20:19:17 / Jan Vrany <vranyj1@fel.cvut.cz>"
+!
+
+mock6
+
+    ^[|temp| [ temp ] ]
+
+    "
+    decompiling IRBuilderTest>>mock6
+    nA: 0 nV: 0 nT: 3
+
+    1: 37 0B 01 00             makeBlock 11 (14) nv=1 na=0
+    5: 37 06 00 00             makeBlock 6 (13) nv=0 na=0
+    9: 80 01 01                pushOuterBlockVar 1 lvl: 1
+    12:00                      retTop
+    13:00                      retTop
+    14:08 03                   LINE[3]
+    16:00                      retTop
+
+    "
+
+    "Created: / 28-03-2009 / 20:20:06 / Jan Vrany <vranyj1@fel.cvut.cz>"
+!
+
+mock7
+    | b |
+    b := 1.
+    ^[ ^b ]
+
+    "
+    decompiling IRBuilderTest>>mock7
+    nA: 0 nV: 1 nT: 2
+
+    1: 79                      push1
+    2: 64                      storeMethodVar1
+    3: 37 06 00 00             makeBlock 6 (11) nv=0 na=0
+    7: 50                      pushMethodVar1
+    8: 08 04                   LINE[4]
+    10:07                      homeRetTop
+    11:08 04                   LINE[4]
+    13:00                      retTop
+
+    "
+
+    "Created: / 28-03-2009 / 20:21:51 / Jan Vrany <vranyj1@fel.cvut.cz>"
+!
+
+mock8
+
+    ^([:arg| arg ] value: 22)
+
+    "Created: / 30-03-2009 / 19:21:48 / Jan Vrany <vranyj1@fel.cvut.cz>"
+!
+
+mock9
+
+    ^[:barg1 | [:barg2 | barg2 ] value: barg1 ]
+        value: 22
+
+    "
+    decompiling IRBuilderTest>>mock9
+    nA: 0 nV: 0 nT: 3
+    
+     1: 37 0C 00 01             makeBlock 12 (15) nv=0 na=1
+     5: 37 04 00 01             makeBlock 4 (11) nv=0 na=1
+     9: 8C                      pushBlockArg1
+    10: 00                      retTop
+    11: 8C                      pushBlockArg1
+    12: 98 03                   send1 #value:[3]
+    14: 00                      retTop
+    15: 10 16                   pushNum 22
+    17: 98 04                   send1 #value:[4]
+    19: 08 03                   LINE[3]
+    21: 00 
+    
+    "
+
+    "Created: / 11-05-2009 / 23:09:57 / Jan Vrany <vranyj1@fel.cvut.cz>"
+! !
+
+!IRBuilderTest methodsFor:'testing'!
+
+halt
+        "Redefinition for testing the #send:toSuperOf:"
+
+    "Created: / 11-06-2008 / 16:08:52 / Jan Vrany <vranyj1@fel.cvut.cz>"
+!
+
+isThisEverCalled
+	"Redefinition for testing the #send:toSuperOf:"
+!
+
+testDup
+    |iRMethod aCompiledMethod|
+
+    iRMethod := (IRBuilder new)
+                numRargs:1;
+                addTemps:#( #self );
+                pushLiteral:3;
+                pushDup;
+                send:#'=';
+                returnTop;
+                ir.
+    aCompiledMethod := iRMethod compiledCode.
+    self assert:(aCompiledMethod isKindOf:CompiledMethod).
+    self 
+        assert:((aCompiledMethod valueWithReceiver:nil arguments:#()) = true).
+!
+
+testInstVar
+    |aCompiledMethod irBuilder|
+
+    irBuilder := (IRBuilder new)
+                numRargs:1;
+                addTemps:#( #self );
+                pushInstVar:1;
+                pushInstVar:2;
+                send:#'+';
+                returnTop;
+                ir.
+    aCompiledMethod := irBuilder compiledCode.
+    self assert:(aCompiledMethod isKindOf:CompiledMethod).
+    self 
+        assert:((aCompiledMethod valueWithReceiver:(3 @ 4) arguments:#()) = 7).
+
+    "Modified: / 11-06-2008 / 13:16:41 / Jan Vrany <vranyj1@fel.cvut.cz>"
+!
+
+testJumpAheadTo
+    |iRMethod aCompiledMethod|
+
+    iRMethod := (IRBuilder new)
+                numRargs:1;
+                addTemps:#( #self );
+                pushTemp:#self;
+                jumpAheadTo:#end;
+                pushLiteral:3;
+                jumpAheadTarget:#end;
+                returnTop;
+                ir.
+    aCompiledMethod := iRMethod compiledCode.
+    self assert:(aCompiledMethod isKindOf:CompiledMethod).
+    self assert:((aCompiledMethod valueWithReceiver:nil arguments:#()) = nil).
+!
+
+testJumpAheadToIf
+    |iRMethod aCompiledMethod|
+
+    iRMethod := (IRBuilder new)
+                numRargs:1;
+                addTemps:#( #self );
+                pushTemp:#self;
+                pushLiteral:true;
+                jumpAheadTo:#end if:true;
+                pushLiteral:3;
+                jumpAheadTarget:#end;
+                returnTop;
+                ir.
+    aCompiledMethod := iRMethod compiledCode.
+    self assert:(aCompiledMethod isKindOf:CompiledMethod).
+    self assert:((aCompiledMethod valueWithReceiver:nil arguments:#()) = nil).
+!
+
+testJumpBackTo
+    |iRMethod aCompiledMethod|
+
+    iRMethod := (IRBuilder new)
+                numRargs:1;
+                addTemps:#( #self );
+                pushTemp:#self;
+                pushLiteral:false;
+                jumpBackTarget:#begin;
+                jumpAheadTo:#end if:true;
+                pushLiteral:true;
+                jumpBackTo:#begin;
+                jumpAheadTarget:#end;
+                returnTop;
+                ir.
+    aCompiledMethod := iRMethod compiledCode.
+    self assert:(aCompiledMethod isKindOf:CompiledMethod).
+    self assert:((aCompiledMethod valueWithReceiver:nil arguments:#()) = nil).
+!
+
+testLine1
+    |iRMethod aCompiledMethod|
+
+    iRMethod := (IRBuilder new)
+                numRargs:1;
+                addTemps:#( #self );
+                line:5;
+                pushLiteral:true;
+                returnTop;
+                ir.
+    aCompiledMethod := iRMethod compiledCode.
+    self assert:(aCompiledMethod isKindOf:CompiledMethod).
+    self 
+        assert:((aCompiledMethod valueWithReceiver:nil arguments:#()) = true).
+
+    "Created: / 02-12-2008 / 09:11:06 / Jan Vrany <vranyj1@fel.cvut.cz>"
+!
+
+testLine2
+    |iRMethod aCompiledMethod|
+
+    iRMethod := (IRBuilder new)
+                numRargs:1;
+                addTemps:#( #self );
+                line:5;
+                pushLiteral:true;
+                pushLiteral:false;
+                send:#'&';
+                returnTop;
+                ir.
+    aCompiledMethod := iRMethod compiledCode.
+    self assert:(aCompiledMethod isKindOf:CompiledMethod).
+    self 
+        assert:((aCompiledMethod valueWithReceiver:nil arguments:#()) = false).
+
+    "Created: / 02-12-2008 / 09:11:42 / Jan Vrany <vranyj1@fel.cvut.cz>"
+!
+
+testLiteralArray
+    |iRMethod aCompiledMethod|
+
+    iRMethod := (IRBuilder new)
+                numRargs:1;
+                addTemps:#( #self );
+                pushLiteral:#( #test 4 #you );
+                returnTop;
+                ir.
+    aCompiledMethod := iRMethod compiledCode.
+    self assert:(aCompiledMethod isKindOf:CompiledMethod).
+    self assert:((aCompiledMethod valueWithReceiver:nil arguments:#()) 
+                = #( #test 4 #you )).
+!
+
+testLiteralBoolean
+    |iRMethod aCompiledMethod|
+
+    iRMethod := (IRBuilder new)
+                numRargs:1;
+                addTemps:#( #self );
+                pushLiteral:true;
+                returnTop;
+                ir.
+    aCompiledMethod := iRMethod compiledCode.
+    self assert:(aCompiledMethod isKindOf:CompiledMethod).
+    self 
+        assert:((aCompiledMethod valueWithReceiver:nil arguments:#()) = true).
+!
+
+testLiteralCharacter
+    |iRMethod aCompiledMethod|
+
+    iRMethod := (IRBuilder new)
+                numRargs:1;
+                addTemps:#( #self );
+                pushLiteral:$e;
+                returnTop;
+                ir.
+    aCompiledMethod := iRMethod compiledCode.
+    self assert:(aCompiledMethod isKindOf:CompiledMethod).
+    self assert:((aCompiledMethod valueWithReceiver:nil arguments:#()) = $e).
+!
+
+testLiteralFloat
+    |iRMethod aCompiledMethod|
+
+    iRMethod := (IRBuilder new)
+                numRargs:1;
+                addTemps:#( #self );
+                pushLiteral:2.0;
+                returnTop;
+                ir.
+    aCompiledMethod := iRMethod compiledCode.
+    self assert:(aCompiledMethod isKindOf:CompiledMethod).
+    self assert:((aCompiledMethod valueWithReceiver:nil arguments:#()) = 2.0).
+
+    "Modified: / 03-11-2008 / 08:39:52 / Jan Vrany <vranyj1@fel.cvut.cz>"
+!
+
+testLiteralInteger
+    |iRMethod aCompiledMethod|
+
+    iRMethod := (IRBuilder new)
+                numRargs:1;
+                addTemps:#( #self );
+                pushLiteral:2;
+                returnTop;
+                ir.
+    aCompiledMethod := iRMethod compiledCode.
+    self assert:(aCompiledMethod isKindOf:CompiledMethod).
+    self assert:((aCompiledMethod valueWithReceiver:nil arguments:#()) = 2).
+!
+
+testLiteralNil
+    |iRMethod aCompiledMethod|
+
+    iRMethod := (IRBuilder new)
+                numRargs:1;
+                addTemps:#( #self );
+                pushLiteral:nil;
+                returnTop;
+                ir.
+    aCompiledMethod := iRMethod compiledCode.
+    self assert:(aCompiledMethod isKindOf:CompiledMethod).
+    self assert:((aCompiledMethod valueWithReceiver:4 arguments:#()) = nil).
+!
+
+testLiteralString
+    |iRMethod aCompiledMethod|
+
+    iRMethod := (IRBuilder new)
+                numRargs:1;
+                addTemps:#( #self );
+                pushLiteral:'hello';
+                returnTop;
+                ir.
+    aCompiledMethod := iRMethod compiledCode.
+    self assert:(aCompiledMethod isKindOf:CompiledMethod).
+    self 
+        assert:((aCompiledMethod valueWithReceiver:nil arguments:#()) = 'hello').
+!
+
+testLiteralSymbole
+    |iRMethod aCompiledMethod|
+
+    iRMethod := (IRBuilder new)
+                numRargs:1;
+                addTemps:#( #self );
+                pushLiteral:#you;
+                returnTop;
+                ir.
+    aCompiledMethod := iRMethod compiledCode.
+    self assert:(aCompiledMethod isKindOf:CompiledMethod).
+    self 
+        assert:((aCompiledMethod valueWithReceiver:nil arguments:#()) = #you).
+!
+
+testLiteralVariableClass
+    |iRMethod aCompiledMethod|
+
+    iRMethod := (IRBuilder new)
+                numRargs:1;
+                addTemps:#( #self );
+                pushLiteralVariable:Object binding;
+                returnTop;
+                ir.
+    aCompiledMethod := iRMethod compiledCode.
+    self assert:(aCompiledMethod isKindOf:CompiledMethod).
+    self 
+        assert:((aCompiledMethod valueWithReceiver:nil arguments:#()) = Object).
+!
+
+testLiteralVariableClassVariable
+    |iRMethod aCompiledMethod|
+
+    iRMethod := (IRBuilder new)
+                numRargs:1;
+                addTemps:#( #self );
+                pushLiteralVariable:(ArithmeticValue bindingOf:#ArithmeticSignal);
+                returnTop;
+                ir.
+    aCompiledMethod := iRMethod compiledCode.
+    self assert:(aCompiledMethod isKindOf:CompiledMethod).
+    self assert:((aCompiledMethod valueWithReceiver:nil arguments:#()) 
+                = ArithmeticValue arithmeticSignal).
+
+    "Modified: / 11-06-2008 / 11:31:32 / Jan Vrany <vranyj1@fel.cvut.cz>"
+!
+
+testLiteralVariableGlobale
+    |iRMethod aCompiledMethod|
+
+    iRMethod := (IRBuilder new)
+                numRargs:1;
+                addTemps:#( #self );
+                pushLiteralVariable:Smalltalk binding;
+                returnTop;
+                ir.
+    aCompiledMethod := iRMethod compiledCode.
+    self assert:(aCompiledMethod isKindOf:CompiledMethod).
+    self 
+        assert:((aCompiledMethod valueWithReceiver:nil arguments:#()) = Smalltalk).
+
+    "Modified: / 11-06-2008 / 11:32:07 / Jan Vrany <vranyj1@fel.cvut.cz>"
+!
+
+testPopTop
+    |iRMethod aCompiledMethod|
+
+    iRMethod := (IRBuilder new)
+                numRargs:1;
+                addTemps:#( #self );
+                pushLiteral:true;
+                pushLiteral:false;
+                popTop;
+                returnTop;
+                ir.
+    aCompiledMethod := iRMethod compiledCode.
+    self assert:(aCompiledMethod isKindOf:CompiledMethod).
+    self 
+        assert:((aCompiledMethod valueWithReceiver:nil arguments:#()) = true).
+
+    "Modified: / 11-06-2008 / 13:22:11 / Jan Vrany <vranyj1@fel.cvut.cz>"
+!
+
+testPushReceiver
+    |iRMethod aCompiledMethod receiver|
+
+    iRMethod := (IRBuilder new)
+                numRargs:1;
+                addTemps:#( #self );
+                pushReceiver;
+                returnTop;
+                ir.
+    aCompiledMethod := iRMethod compiledCode.
+    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 );
+                pushTemp:#a;
+                pushTemp:#b;
+                send:#'+';
+                returnTop;
+                ir.
+    aCompiledMethod := iRMethod compiledCode.
+    self assert:(aCompiledMethod isKindOf:CompiledMethod).
+    self 
+        assert:((aCompiledMethod valueWithReceiver:nil arguments:#( 2 8 )) = 10).
+!
+
+testPushTempSelf
+    |iRMethod aCompiledMethod|
+
+    iRMethod := (IRBuilder new)
+                numRargs:1;
+                addTemps:#( #self );
+                pushTemp:#self;
+                send:#class;
+                returnTop;
+                ir.
+    aCompiledMethod := iRMethod compiledCode.
+    self assert:(aCompiledMethod isKindOf:CompiledMethod).
+    self assert:((aCompiledMethod valueWithReceiver:nil arguments:#()) 
+                == UndefinedObject).
+!
+
+testPushTempTemp
+    |iRMethod aCompiledMethod|
+
+    iRMethod := (IRBuilder new)
+                numRargs:1;
+                addTemps:#( #self #a );
+                pushTemp:#a;
+                returnTop;
+                ir.
+    aCompiledMethod := iRMethod compiledCode.
+    self assert:(aCompiledMethod isKindOf:CompiledMethod).
+    self assert:((aCompiledMethod valueWithReceiver:5 arguments:#()) = nil).
+!
+
+testPushThisContext
+    |iRMethod aCompiledMethod|
+
+    iRMethod := (IRBuilder new)
+                numRargs:1;
+                addTemps:#( #self #a );
+                pushThisContext;
+                send:#receiver;
+                returnTop;
+                ir.
+    aCompiledMethod := iRMethod compiledCode.
+    self assert:(aCompiledMethod isKindOf:CompiledMethod).
+    self assert:((aCompiledMethod valueWithReceiver:5 arguments:#()) = 5).
+!
+
+testPushThisEnv
+    |iRMethod aCompiledMethod receiver|
+
+    ^ self.
+    iRMethod := (IRBuilder new)
+                numRargs:1;
+                addTemps:#( #self );
+                pushThisContext;
+                pushLiteral:5;
+                pushLiteral:ClosureEnvironment;
+                pushLiteral:1;
+                send:#new:;
+                send:#privSetInstVar:put:;
+                pushThisEnv;
+                returnTop;
+                ir.
+    aCompiledMethod := iRMethod compiledCode.
+    receiver := Object new.
+    self assert:(aCompiledMethod isKindOf:CompiledMethod).
+    self assert:((aCompiledMethod valueWithReceiver:receiver arguments:#()) 
+                isKindOf:ClosureEnvironment)
+!
+
+testSendNumArgs1
+    |iRMethod aCompiledMethod|
+
+    iRMethod := (IRBuilder new)
+                numRargs:1;
+                addTemps:#( #self );
+                pushReceiver;
+                pushLiteral:1;
+                pushLiteral:2;
+                send:#mock1 numArgs:2;
+                returnTop;
+                ir.
+    aCompiledMethod := iRMethod compiledCode.
+    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 );
+                pushReceiver;
+                pushLiteral:1;
+                send:#mock1 numArgs:1;
+                returnTop;
+                ir.
+    aCompiledMethod := iRMethod compiledCode.
+    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|
+
+    iRMethod := (IRBuilder new)
+                numRargs:1;
+                addTemps:#( #self );
+                pushReceiver;
+                send:#halt toSuperOf:IRBuilderTest;
+                returnTop;
+                ir.
+    aCompiledMethod := iRMethod compiledCode.
+    self assert:(aCompiledMethod isKindOf:CompiledMethod).
+    self 
+        should:[
+            (aCompiledMethod valueWithReceiver:(IRBuilderTest new) arguments:#())
+        ]
+        raise:Error.
+
+    "Modified: / 11-06-2008 / 16:09:12 / Jan Vrany <vranyj1@fel.cvut.cz>"
+!
+
+testStorIntoVariable
+    |iRMethod aCompiledMethod|
+
+    iRMethod := (IRBuilder new)
+                numRargs:1;
+                addTemps:#( #self );
+                pushLiteral:4;
+                storeIntoLiteralVariable:(IRBuilderTest bindingOf:#TestToPush);
+                returnTop;
+                ir.
+    aCompiledMethod := iRMethod compiledCode.
+    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 );
+                pushLiteral:34;
+                storeTemp:#a;
+                pushTemp:#a;
+                returnTop;
+                ir.
+    aCompiledMethod := iRMethod compiledCode.
+    self assert:(aCompiledMethod isKindOf:CompiledMethod).
+    self assert:((aCompiledMethod valueWithReceiver:nil arguments:#()) = 34).
+
+    "Modified: / 11-06-2008 / 16:24:43 / Jan Vrany <vranyj1@fel.cvut.cz>"
+!
+
+testStoreThisEnv
+    |iRMethod aCompiledMethod|
+
+    ^ self.
+    iRMethod := (IRBuilder new)
+                numRargs:1;
+                addTemps:#( #self #a );
+                pushLiteral:ClosureEnvironment;
+                pushLiteral:1;
+                send:#new:;
+                storeThisEnv;
+                pushThisContext;
+                pushLiteral:5;
+                send:#privGetInstVar:;
+                returnTop;
+                ir.
+    aCompiledMethod := iRMethod compiledCode.
+    self assert:(aCompiledMethod isKindOf:CompiledMethod).
+    self assert:((aCompiledMethod valueWithReceiver:nil arguments:#()) 
+                isKindOf:ClosureEnvironment).
+
+    "Modified: / 11-06-2008 / 14:47:51 / Jan Vrany <vranyj1@fel.cvut.cz>"
+!
+
+testTwoJumpAheadToIfsToSameTarget
+    |iRMethod aCompiledMethod|
+
+    iRMethod := (IRBuilder new)
+                numRargs:1;
+                addTemps:#( #self );
+                pushTemp:#self;
+                pushLiteral:false;
+                jumpAheadTo:#end if:true;
+                pushLiteral:true;
+                jumpAheadTo:#end if:true;
+                pushLiteral:3;
+                jumpAheadTarget:#end;
+                returnTop;
+                ir.
+    aCompiledMethod := iRMethod compiledCode.
+    self assert:(aCompiledMethod isKindOf:CompiledMethod).
+    self assert:((aCompiledMethod valueWithReceiver:nil arguments:#()) = nil).
+
+    "Created: / 03-11-2008 / 13:34:50 / Jan Vrany <vranyj1@fel.cvut.cz>"
+! !
+
+!IRBuilderTest methodsFor:'testing - blocks'!
+
+testBlock_blockNesting_1
+    |aCompiledMethod irBuilder|
+
+    irBuilder := (IRBuilder new)
+                numRargs:1;
+                addTemps:#( #self );
+                pushBlockUsingBuilder:[:builder | 
+                        builder
+                            numRargs:1;
+                            addTemps:#( #barg1 );
+                            pushBlockUsingBuilder:[:builder|
+                                builder
+                                    numRargs: 1;
+                                    addTemps: #( #barg2 );
+                                    pushTemp: #barg2;
+                                    returnTop
+                            ];
+                            pushTemp: #barg1;
+                            send: #value:;
+                            returnTop
+                    ];
+                pushLiteral: 22;
+                send:#value;
+                returnTop;
+                ir.
+    "
+        irBuilder ir
+    "
+
+    aCompiledMethod := irBuilder compiledCode.
+    self assert:(aCompiledMethod isKindOf:CompiledMethod).
+    self assert:((aCompiledMethod valueWithReceiver:1 arguments:#()) = 22).
+
+    "Created: / 11-05-2009 / 23:04:13 / Jan Vrany <vranyj1@fel.cvut.cz>"
+!
+
+testBlock_blockTempArg
+    |aCompiledMethod irBuilder|
+
+    irBuilder := (IRBuilder new)
+                numRargs:1;
+                addTemps:#( #self );
+                pushBlockUsingBuilder:[:builder | 
+                        builder
+                            numRargs:1;
+                            addTemps:#( #barg1 );
+                            pushTemp:#barg1;
+                            returnTop
+                    ];
+                pushLiteral:22;
+                send:#value:;
+                returnTop;
+                ir.
+    "
+        irBuilder ir
+    "
+
+    aCompiledMethod := irBuilder compiledCode.
+    self assert:(aCompiledMethod isKindOf:CompiledMethod).
+    self assert:((aCompiledMethod valueWithReceiver:1 arguments:#()) = 22).
+
+    "Created: / 30-03-2009 / 14:26:18 / Jan Vrany <vranyj1@fel.cvut.cz>"
+    "Modified: / 30-03-2009 / 19:16:25 / Jan Vrany <vranyj1@fel.cvut.cz>"
+!
+
+testBlock_blockTempVar
+    |aCompiledMethod irBuilder|
+
+    irBuilder := (IRBuilder new)
+                numRargs:1;
+                addTemps:#( #self );
+                pushBlockUsingBuilder:[:builder | 
+                        builder
+                            numRargs:0;
+                            addTemps:#( #bvar1 );
+                            pushLiteral: 22;
+                            storeTemp:#bvar1;
+                            pushTemp: #bvar1;
+                            returnTop
+                    ];
+                send:#value;
+                returnTop;
+                ir.
+    "
+        irBuilder ir
+    "
+
+    aCompiledMethod := irBuilder compiledCode.
+    self assert:(aCompiledMethod isKindOf:CompiledMethod).
+    self assert:((aCompiledMethod valueWithReceiver:1 arguments:#()) = 22).
+
+    "Created: / 30-03-2009 / 23:03:48 / Jan Vrany <vranyj1@fel.cvut.cz>"
+!
+
+testBlock_block_in_another_basic_block
+    |aCompiledMethod irBuilder|
+
+    irBuilder := (IRBuilder new)
+                numRargs:1;
+                addTemps:#( #self );
+                pushLiteral: false;
+                pushLiteral: true;
+                jumpAheadTo: #end if: false;
+                pushBlockUsingBuilder:[:builder | 
+                        builder
+                            numRargs: 0;
+                            pushLiteral: true;
+                            returnTop
+                    ];
+                send: #value;
+                jumpAheadTarget: #end;
+                returnTop;
+                ir.
+    "
+        irBuilder ir
+    "
+
+    aCompiledMethod := irBuilder compiledCode.
+    self assert:(aCompiledMethod isKindOf:CompiledMethod).
+    self assert:((aCompiledMethod valueWithReceiver:1 arguments:#()) = true).
+
+    "Created: / 13-05-2009 / 11:24:48 / Jan Vrany <vranyj1@fel.cvut.cz>"
+!
+
+testBlock_exceptionHandler
+    |aCompiledMethod irBuilder|
+
+    irBuilder := (IRBuilder new)
+                numRargs:1;
+                addTemps:#( #self);
+               pushBlockUsingBuilder:[:builder | 
+                        builder
+                            numRargs:0;  
+                            pushLiteral: 1;
+                            pushLiteral: 0;
+                            send: #/;
+                            pushLiteral: false;
+                            remoteReturn
+                    ];
+                pushLiteralVariable: #Error;
+                pushBlockUsingBuilder:[:builder|
+                    builder
+                        numRargs:0;
+                        pushLiteral: true;
+                        remoteReturn];
+                send: #on:do:;
+                pushLiteral: false;
+                returnTop;
+                ir.
+    "
+        irBuilder ir
+    "
+
+    aCompiledMethod := irBuilder compiledCode.
+    self assert:(aCompiledMethod isKindOf:CompiledMethod).
+    self assert:((aCompiledMethod valueWithReceiver:1 arguments:#()) = true).
+
+    "Created: / 11-05-2009 / 21:53:19 / Jan Vrany <vranyj1@fel.cvut.cz>"
+!
+
+testBlock_exceptionHandler_noRemoteReturn
+    |aCompiledMethod irBuilder|
+
+    irBuilder := (IRBuilder new)
+                numRargs:1;
+                addTemps:#( #self);
+               pushBlockUsingBuilder:[:builder | 
+                        builder
+                            numRargs:0;  
+                            pushLiteral: 1;
+                            pushLiteral: 0;
+                            send: #/;
+                            pushLiteral: false;
+                            returnTop
+                    ];
+                pushLiteralVariable: #Error;
+                pushBlockUsingBuilder:[:builder|
+                    builder
+                        numRargs:0;
+                        pushLiteral: true;
+                        returnTop];
+                send: #on:do:;
+                returnTop;
+                ir.
+    "
+        irBuilder ir
+    "
+
+    aCompiledMethod := irBuilder compiledCode.
+    self assert:(aCompiledMethod isKindOf:CompiledMethod).
+    self assert:((aCompiledMethod valueWithReceiver:1 arguments:#()) = true).
+
+    "Created: / 11-05-2009 / 21:53:25 / Jan Vrany <vranyj1@fel.cvut.cz>"
+!
+
+testBlock_invalid_instruction_ordering_bug_1
+    |aCompiledMethod irBuilder|
+
+    irBuilder := (IRBuilder new)
+                    numRargs: 1;
+                    addTemps: #(self i);
+                    pushTemp: #i;
+                    pushLiteral: 3;
+                    pushReceiver;
+
+                    pushBlockUsingBuilder: [ :builder | 
+                        builder
+                            numRargs: 0;
+                            addTemps: #();
+                            pushTemp: #i;
+                            returnTop.
+                    ];
+                    returnTop;
+                    ir.
+    "
+        irBuilder ir
+    "
+
+    aCompiledMethod := irBuilder compiledCode.
+    self assert:(aCompiledMethod isKindOf:CompiledMethod).
+    self assert:((aCompiledMethod valueWithReceiver:1 arguments:#()) isKindOf: Block).
+
+    "Created: / 11-05-2009 / 21:55:30 / Jan Vrany <vranyj1@fel.cvut.cz>"
+!
+
+testBlock_methodTempVar
+    |aCompiledMethod irBuilder|
+
+    irBuilder := (IRBuilder new)
+                numRargs:1;
+                addTemps:#( #self #a);
+                pushLiteral: 22;
+                storeTemp: #a;
+                pushBlockUsingBuilder:[:builder | 
+                        builder
+                            numRargs:0;
+                            pushTemp: #a;
+                            returnTop
+                    ];
+                send:#value;
+                returnTop;
+                ir.
+    "
+        irBuilder ir
+    "
+
+    aCompiledMethod := irBuilder compiledCode.
+    self assert:(aCompiledMethod isKindOf:CompiledMethod).
+    self assert:((aCompiledMethod valueWithReceiver:1 arguments:#()) = 22).
+
+    "Created: / 30-03-2009 / 23:05:00 / Jan Vrany <vranyj1@fel.cvut.cz>"
+    "Modified: / 01-04-2009 / 19:43:52 / Jan Vrany <vranyj1@fel.cvut.cz>"
+! !
+
+!IRBuilderTest class methodsFor:'documentation'!
+
+version_CVS
+    ^ 'Header: /cvs/stx/cvut/stx/goodies/newcompiler/IRBuilderTest.st,v 1.3 2009/10/08 12:03:51 fm Exp '
+!
+
+version_SVN
+    ^ '$Id::                                                                                                                        $'
+! !
+