1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121
|
import py
from rpython.jit.tl.tinyframe.tinyframe import *
class TestCompile(object):
def test_simple(self):
code = compile('''
main:
LOAD 0 => r1
LOAD 1 => r0 # comment
# other comment
ADD r0 r1 => r2
PRINT r2
''')
assert disassemble(code) == [
LOAD, 0, 1, LOAD, 1, 0, ADD, 0, 1, 2, PRINT, 2
]
def test_return(self):
code = compile('''
main:
LOAD 0 => r1
LOAD 1 => r0 # comment
# other comment
ADD r0 r1 => r2
RETURN r2
''')
res = interpret(code)
assert isinstance(res, Int)
assert res.val == 1
def test_loop(self):
code = compile('''
main:
LOAD 1 => r1
LOAD 100 => r2
LOAD 0 => r0
@l1
ADD r0 r1 => r0
JUMP_IF_ABOVE r2 r0 @l1
RETURN r0
''')
ret = interpret(code)
assert ret.val == 100
def test_function(self):
code = compile('''
func: # arg comes in r0
LOAD 1 => r1
ADD r0 r1 => r1
RETURN r1
main:
LOAD_FUNCTION func => r0
LOAD 1 => r1
CALL r0 r1 => r2
RETURN r2
''')
ret = interpret(code)
assert ret.val == 1 + 1
def test_function_combination(self):
code = compile('''
inner:
LOAD 2 => r1
ADD r1 r0 => r0
RETURN r0
outer:
LOAD 1 => r1
ADD r1 r0 => r2
RETURN r2
main:
LOAD_FUNCTION inner => r0
LOAD_FUNCTION outer => r1
ADD r1 r0 => r2
LOAD 1 => r3
CALL r2 r3 => r4
RETURN r4
''')
ret = interpret(code)
assert ret.val == 1 + 1 + 2
def test_print(self):
import sys
from StringIO import StringIO
code = compile('''
name:
RETURN r0
main:
LOAD 0 => r1
PRINT r1
LOAD_FUNCTION name => r1
PRINT r1
ADD r1 r1 => r2
PRINT r2
RETURN r1
''')
s = StringIO()
prev = sys.stdout
sys.stdout = s
try:
interpret(code)
finally:
sys.stdout = prev
lines = s.getvalue().splitlines()
assert lines == [
'0',
'<function name>',
'<function <function name>(<function name>)>',
]
def test_introspect(self):
code = compile('''
main:
LOAD 100 => r0
LOAD 0 => r1
INTROSPECT r1 => r2
RETURN r0
''')
res = interpret(code)
assert res.val == 100
|