File: test_tinyframe.py

package info (click to toggle)
pypy 5.6.0%2Bdfsg-4
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 97,040 kB
  • ctags: 185,069
  • sloc: python: 1,147,862; ansic: 49,642; cpp: 5,245; asm: 5,169; makefile: 529; sh: 481; xml: 232; lisp: 45
file content (121 lines) | stat: -rw-r--r-- 2,693 bytes parent folder | download | duplicates (9)
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