<s> import py <EOL> import operator <EOL> from pypy . jit . tl . tlopcode import * <EOL> from pypy . translator . c . test import test_boehm <EOL> from pypy . annotation import policy <EOL> def list2bytecode ( insn ) : <EOL> return '<STR_LIT>' . join ( [ chr ( i & <NUM_LIT> ) for i in insn ] ) <EOL> class TestTL ( test_boehm . AbstractGCTestClass ) : <EOL> from pypy . jit . tl . tl import interp <EOL> interp = staticmethod ( interp ) <EOL> def test_tl_push ( self ) : <EOL> assert self . interp ( list2bytecode ( [ PUSH , <NUM_LIT:16> ] ) ) == <NUM_LIT:16> <EOL> def test_tl_pop ( self ) : <EOL> assert self . interp ( list2bytecode ( [ PUSH , <NUM_LIT:16> , PUSH , <NUM_LIT> , PUSH , <NUM_LIT:100> , POP ] ) ) == <NUM_LIT> <EOL> def test_tl_add ( self ) : <EOL> assert self . interp ( list2bytecode ( [ PUSH , <NUM_LIT> , PUSH , <NUM_LIT:100> , ADD ] ) ) == <NUM_LIT> <EOL> assert self . interp ( list2bytecode ( [ PUSH , <NUM_LIT:16> , PUSH , <NUM_LIT> , PUSH , <NUM_LIT:100> , ADD ] ) ) == <NUM_LIT> <EOL> def test_tl_error ( self ) : <EOL> py . test . raises ( IndexError , self . interp , list2bytecode ( [ POP ] ) ) <EOL> py . test . raises ( IndexError , self . interp , list2bytecode ( [ ADD ] ) ) <EOL> py . test . raises ( IndexError , self . interp , list2bytecode ( [ PUSH , <NUM_LIT:100> , ADD ] ) ) <EOL> def test_tl_invalid_codetype ( self ) : <EOL> py . test . raises ( TypeError , self . interp , [ INVALID ] ) <EOL> def test_tl_invalid_bytecode ( self ) : <EOL> py . test . raises ( RuntimeError , self . interp , list2bytecode ( [ INVALID ] ) ) <EOL> def test_tl_translatable ( self ) : <EOL> code = list2bytecode ( [ PUSH , <NUM_LIT> , PUSH , <NUM_LIT:100> , ADD ] ) <EOL> fn = self . getcompiled ( self . interp , [ str , int , int ] ) <EOL> assert self . interp ( code , <NUM_LIT:0> , <NUM_LIT:0> ) == fn ( code , <NUM_LIT:0> , <NUM_LIT:0> ) <EOL> def test_swap ( self ) : <EOL> code = [ PUSH , <NUM_LIT> , PUSH , <NUM_LIT> ] <EOL> assert self . interp ( list2bytecode ( code ) ) == <NUM_LIT> <EOL> code . append ( SWAP ) <EOL> assert self . interp ( list2bytecode ( code ) ) == <NUM_LIT> <EOL> code . append ( POP ) <EOL> assert self . interp ( list2bytecode ( code ) ) == <NUM_LIT> <EOL> def test_pick ( self ) : <EOL> values = [ <NUM_LIT:7> , <NUM_LIT:8> , <NUM_LIT:9> ] <EOL> code = [ ] <EOL> for v in values [ : : - <NUM_LIT:1> ] : <EOL> code . extend ( [ PUSH , v ] ) <EOL> for i , v in enumerate ( values ) : <EOL> assert self . interp ( list2bytecode ( code + [ PICK , i ] ) ) == v <EOL> def test_put ( self ) : <EOL> values = [ <NUM_LIT:1> , <NUM_LIT:2> , <NUM_LIT:7> , - <NUM_LIT:3> ] <EOL> code = [ PUSH , <NUM_LIT:0> ] * len ( values ) <EOL> for i , v in enumerate ( values ) : <EOL> code += [ PUSH , v , PUT , i ] <EOL> for i , v in enumerate ( values ) : <EOL> assert self . interp ( list2bytecode ( code + [ PICK , i ] ) ) == v <EOL> ops = [ ( ADD , operator . add , ( ( <NUM_LIT:2> , <NUM_LIT:4> ) , ( <NUM_LIT:1> , <NUM_LIT:1> ) , ( - <NUM_LIT:1> , <NUM_LIT:1> ) ) ) , <EOL> ( SUB , operator . sub , ( ( <NUM_LIT:2> , <NUM_LIT:4> ) , ( <NUM_LIT:4> , <NUM_LIT:2> ) , ( <NUM_LIT:1> , <NUM_LIT:1> ) ) ) , <EOL> ( MUL , operator . mul , ( ( <NUM_LIT:2> , <NUM_LIT:4> ) , ( <NUM_LIT:4> , <NUM_LIT:2> ) , ( <NUM_LIT:1> , <NUM_LIT:1> ) , ( - <NUM_LIT:1> , <NUM_LIT:6> ) , ( <NUM_LIT:0> , <NUM_LIT:5> ) ) ) , <EOL> ( DIV , operator . div , ( ( <NUM_LIT:2> , <NUM_LIT:4> ) , ( <NUM_LIT:4> , <NUM_LIT:2> ) , ( <NUM_LIT:1> , <NUM_LIT:1> ) , ( - <NUM_LIT:4> , - <NUM_LIT:2> ) , ( <NUM_LIT:0> , <NUM_LIT:9> ) , ( <NUM_LIT:9> , - <NUM_LIT:3> ) ) ) , <EOL> ( EQ , operator . eq , ( ( <NUM_LIT:0> , <NUM_LIT:0> ) , ( <NUM_LIT:0> , <NUM_LIT:1> ) , ( <NUM_LIT:1> , <NUM_LIT:0> ) , ( <NUM_LIT:1> , <NUM_LIT:1> ) , ( - <NUM_LIT:1> , <NUM_LIT:0> ) , ( <NUM_LIT:0> , - <NUM_LIT:1> ) , ( - <NUM_LIT:1> , - <NUM_LIT:1> ) , ( <NUM_LIT:1> , - <NUM_LIT:1> ) , ( - <NUM_LIT:1> , <NUM_LIT:1> ) ) ) , <EOL> ( NE , operator . ne , ( ( <NUM_LIT:0> , <NUM_LIT:0> ) , ( <NUM_LIT:0> , <NUM_LIT:1> ) , ( <NUM_LIT:1> , <NUM_LIT:0> ) , ( <NUM_LIT:1> , <NUM_LIT:1> ) , ( - <NUM_LIT:1> , <NUM_LIT:0> ) , ( <NUM_LIT:0> , - <NUM_LIT:1> ) , ( - <NUM_LIT:1> , - <NUM_LIT:1> ) , ( <NUM_LIT:1> , - <NUM_LIT:1> ) , ( - <NUM_LIT:1> , <NUM_LIT:1> ) ) ) , <EOL> ( LT , operator . lt , ( ( <NUM_LIT:0> , <NUM_LIT:0> ) , ( <NUM_LIT:0> , <NUM_LIT:1> ) , ( <NUM_LIT:1> , <NUM_LIT:0> ) , ( <NUM_LIT:1> , <NUM_LIT:1> ) , ( - <NUM_LIT:1> , <NUM_LIT:0> ) , ( <NUM_LIT:0> , - <NUM_LIT:1> ) , ( - <NUM_LIT:1> , - <NUM_LIT:1> ) , ( <NUM_LIT:1> , - <NUM_LIT:1> ) , ( - <NUM_LIT:1> , <NUM_LIT:1> ) ) ) , <EOL> ( LE , operator . le , ( ( <NUM_LIT:0> , <NUM_LIT:0> ) , ( <NUM_LIT:0> , <NUM_LIT:1> ) , ( <NUM_LIT:1> , <NUM_LIT:0> ) , ( <NUM_LIT:1> , <NUM_LIT:1> ) , ( - <NUM_LIT:1> , <NUM_LIT:0> ) , ( <NUM_LIT:0> , - <NUM_LIT:1> ) , ( - <NUM_LIT:1> , - <NUM_LIT:1> ) , ( <NUM_LIT:1> , - <NUM_LIT:1> ) , ( - <NUM_LIT:1> , <NUM_LIT:1> ) ) ) , <EOL> ( GT , operator . gt , ( ( <NUM_LIT:0> , <NUM_LIT:0> ) , ( <NUM_LIT:0> , <NUM_LIT:1> ) , ( <NUM_LIT:1> , <NUM_LIT:0> ) , ( <NUM_LIT:1> , <NUM_LIT:1> ) , ( - <NUM_LIT:1> , <NUM_LIT:0> ) , ( <NUM_LIT:0> , - <NUM_LIT:1> ) , ( - <NUM_LIT:1> , - <NUM_LIT:1> ) , ( <NUM_LIT:1> , - <NUM_LIT:1> ) , ( - <NUM_LIT:1> , <NUM_LIT:1> ) ) ) , <EOL> ( GE , operator . ge , ( ( <NUM_LIT:0> , <NUM_LIT:0> ) , ( <NUM_LIT:0> , <NUM_LIT:1> ) , ( <NUM_LIT:1> , <NUM_LIT:0> ) , ( <NUM_LIT:1> , <NUM_LIT:1> ) , ( - <NUM_LIT:1> , <NUM_LIT:0> ) , ( <NUM_LIT:0> , - <NUM_LIT:1> ) , ( - <NUM_LIT:1> , - <NUM_LIT:1> ) , ( <NUM_LIT:1> , - <NUM_LIT:1> ) , ( - <NUM_LIT:1> , <NUM_LIT:1> ) ) ) , <EOL> ] <EOL> def test_ops ( self ) : <EOL> for insn , pyop , values in self . ops : <EOL> for first , second in values : <EOL> code = [ PUSH , first , PUSH , second , insn ] <EOL> assert self . interp ( list2bytecode ( code ) ) == pyop ( first , second ) <EOL> def test_branch_forward ( self ) : <EOL> assert self . interp ( list2bytecode ( [ PUSH , <NUM_LIT:1> , PUSH , <NUM_LIT:0> , BR_COND , <NUM_LIT:2> , PUSH , - <NUM_LIT:1> ] ) ) == - <NUM_LIT:1> <EOL> assert self . interp ( list2bytecode ( [ PUSH , <NUM_LIT:1> , PUSH , <NUM_LIT:1> , BR_COND , <NUM_LIT:2> , PUSH , - <NUM_LIT:1> ] ) ) == <NUM_LIT:1> <EOL> assert self . interp ( list2bytecode ( [ PUSH , <NUM_LIT:1> , PUSH , - <NUM_LIT:1> , BR_COND , <NUM_LIT:2> , PUSH , - <NUM_LIT:1> ] ) ) == <NUM_LIT:1> <EOL> def test_branch_backwards ( self ) : <EOL> assert self . interp ( list2bytecode ( [ PUSH , <NUM_LIT:0> , PUSH , <NUM_LIT:1> , BR_COND , <NUM_LIT:6> , PUSH , - <NUM_LIT:1> , PUSH , <NUM_LIT:3> , BR_COND , <NUM_LIT:4> , PUSH , <NUM_LIT:2> , BR_COND , - <NUM_LIT:10> ] ) ) == - <NUM_LIT:1> <EOL> def test_branch0 ( self ) : <EOL> assert self . interp ( list2bytecode ( [ PUSH , <NUM_LIT:7> , PUSH , <NUM_LIT:1> , BR_COND , <NUM_LIT:0> ] ) ) == <NUM_LIT:7> <EOL> def test_return ( self ) : <EOL> assert py . test . raises ( IndexError , self . interp , list2bytecode ( [ RETURN ] ) ) <EOL> assert self . interp ( list2bytecode ( [ PUSH , <NUM_LIT:7> , RETURN , PUSH , <NUM_LIT:5> ] ) ) == <NUM_LIT:7> <EOL> def test_rot ( self ) : <EOL> code = [ PUSH , <NUM_LIT:1> , PUSH , <NUM_LIT:2> , PUSH , <NUM_LIT:3> , ROLL , <NUM_LIT:3> ] <EOL> assert self . interp ( list2bytecode ( code ) ) == <NUM_LIT:1> <EOL> assert self . interp ( list2bytecode ( code + [ POP ] ) ) == <NUM_LIT:3> <EOL> assert self . interp ( list2bytecode ( code + [ POP , POP ] ) ) == <NUM_LIT:2> <EOL> py . test . raises ( IndexError , self . interp , list2bytecode ( [ PUSH , <NUM_LIT:1> , PUSH , <NUM_LIT:2> , PUSH , <NUM_LIT:3> , ROLL , <NUM_LIT:4> ] ) ) <EOL> code = [ PUSH , <NUM_LIT:1> , PUSH , <NUM_LIT:2> , PUSH , <NUM_LIT:3> , ROLL , - <NUM_LIT:3> ] <EOL> assert self . interp ( list2bytecode ( code ) ) == <NUM_LIT:2> <EOL> assert self . interp ( list2bytecode ( code + [ POP ] ) ) == <NUM_LIT:1> <EOL> assert self . interp ( list2bytecode ( code + [ POP , POP ] ) ) == <NUM_LIT:3> <EOL> py . test . raises ( IndexError , self . interp , list2bytecode ( [ PUSH , <NUM_LIT:1> , PUSH , <NUM_LIT:2> , PUSH , <NUM_LIT:3> , ROLL , - <NUM_LIT:4> ] ) ) <EOL> def test_call_ret ( self ) : <EOL> assert self . interp ( list2bytecode ( [ CALL , <NUM_LIT:1> , RETURN , PUSH , <NUM_LIT:2> ] ) ) == <NUM_LIT:2> <EOL> assert self . interp ( list2bytecode ( [ PUSH , <NUM_LIT:6> , CALL , <NUM_LIT:2> , MUL , RETURN , PUSH , <NUM_LIT:7> , RETURN ] ) ) == <NUM_LIT> <EOL> def test_compile_branch_backwards ( self ) : <EOL> code = compile ( """<STR_LIT>""" ) <EOL> assert code == list2bytecode ( [ PUSH , <NUM_LIT:0> , PUSH , <NUM_LIT:1> , BR_COND , <NUM_LIT:6> , PUSH , - <NUM_LIT:1> , PUSH , <NUM_LIT:3> , BR_COND , <NUM_LIT:4> , PUSH , <NUM_LIT:2> , BR_COND , - <NUM_LIT:10> ] ) <EOL> def test_compile_call_ret ( self ) : <EOL> code = compile ( """<STR_LIT>""" ) <EOL> assert code == list2bytecode ( [ PUSH , <NUM_LIT:1> , CALL , <NUM_LIT:5> , PUSH , <NUM_LIT:3> , CALL , <NUM_LIT:4> , RETURN , <EOL> PUSH , <NUM_LIT:2> , RETURN , <EOL> PUSH , <NUM_LIT:4> , PUSH , <NUM_LIT:5> , ADD , RETURN ] ) <EOL> def test_factorial_seven ( self ) : <EOL> code = compile ( '''<STR_LIT>''' ) <EOL> res = self . interp ( code ) <EOL> assert res == <NUM_LIT> <EOL> def test_factorial_seven_harder ( self ) : <EOL> code = compile ( '''<STR_LIT>''' ) <EOL> res = self . interp ( code ) <EOL> assert res == <NUM_LIT> <EOL> def test_factorial_with_arg ( self ) : <EOL> code = compile ( FACTORIAL_SOURCE ) <EOL> res = self . interp ( code , <NUM_LIT:0> , <NUM_LIT:6> ) <EOL> assert res == <NUM_LIT> <EOL> def test_translate_factorial ( self ) : <EOL> py . test . skip ( "<STR_LIT:?>" ) <EOL> code = compile ( FACTORIAL_SOURCE ) <EOL> interp = self . interp <EOL> def driver ( ) : <EOL> bench = Benchmark ( ) <EOL> while <NUM_LIT:1> : <EOL> res = interp ( code , <NUM_LIT:0> , <NUM_LIT> ) <EOL> if bench . stop ( ) : <EOL> break <EOL> return res <EOL> fn = self . getcompiled ( driver , [ ] ) <EOL> res = fn ( ) <EOL> assert res == <NUM_LIT:0> <EOL> FACTORIAL_SOURCE = '''<STR_LIT>''' <EOL> if __name__ == '<STR_LIT:__main__>' : <EOL> code = compile ( FACTORIAL_SOURCE ) <EOL> print '<STR_LIT:U+002C>' . join ( [ str ( ord ( c ) ) for c in code ] ) </s>
