File: test_rvmprof.py

package info (click to toggle)
pypy 7.0.0%2Bdfsg-3
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 107,216 kB
  • sloc: python: 1,201,787; ansic: 62,419; asm: 5,169; cpp: 3,017; sh: 2,534; makefile: 545; xml: 243; lisp: 45; awk: 4
file content (158 lines) | stat: -rw-r--r-- 5,299 bytes parent folder | download | duplicates (8)
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
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
import py
from rpython.rlib import jit
from rpython.rtyper.annlowlevel import llhelper
from rpython.rtyper.lltypesystem import lltype, rffi
from rpython.rlib.rvmprof import cintf, vmprof_execute_code, register_code,\
    register_code_object_class, _get_vmprof
from rpython.jit.backend.x86.arch import WORD
from rpython.jit.codewriter.policy import JitPolicy


class BaseRVMProfTest(object):

    def setup_method(self, meth):
        visited = []

        def helper():
            trace = []
            stack = cintf.vmprof_tl_stack.getraw()
            while stack:
                trace.append((stack.c_kind, stack.c_value))
                stack = stack.c_next
            visited.append(trace)

        llfn = llhelper(lltype.Ptr(lltype.FuncType([], lltype.Void)), helper)

        class CodeObj(object):
            def __init__(self, name):
                self.name = name

        def get_code_fn(codes, code, arg, c):
            return code

        def get_name(code):
            return "foo"

        _get_vmprof().use_weaklist = False
        register_code_object_class(CodeObj, get_name)

        self.misc = visited, llfn, CodeObj, get_code_fn, get_name


    def teardown_method(self, meth):
        del _get_vmprof().use_weaklist


    def test_simple(self):
        visited, llfn, CodeObj, get_code_fn, get_name = self.misc
        driver = jit.JitDriver(greens=['code'], reds=['c', 'i', 'n', 'codes'])

        @vmprof_execute_code("main", get_code_fn,
                             _hack_update_stack_untranslated=True)
        def f(codes, code, n, c):
            i = 0
            while i < n:
                driver.jit_merge_point(code=code, c=c, i=i, codes=codes, n=n)
                if code.name == "main":
                    c = f(codes, codes[1], 1, c)
                else:
                    llfn()
                    c -= 1
                i += 1
            return c

        def main(n):
            codes = [CodeObj("main"), CodeObj("not main")]
            for code in codes:
                register_code(code, get_name)
            return f(codes, codes[0], n, 8)

        null = lltype.nullptr(cintf.VMPROFSTACK)
        cintf.vmprof_tl_stack.setraw(null)
        self.meta_interp(main, [30], inline=True)
        assert visited[:3] == [[(1, 12), (1, 8)], [(1, 12), (1, 8)], [(1, 12), (1, 8)]]


    def test_leaving_with_exception(self):
        visited, llfn, CodeObj, get_code_fn, get_name = self.misc
        driver = jit.JitDriver(greens=['code'], reds=['c', 'i', 'n', 'codes'])

        class MyExc(Exception):
            def __init__(self, c):
                self.c = c

        @vmprof_execute_code("main", get_code_fn,
                             _hack_update_stack_untranslated=True)
        def f(codes, code, n, c):
            i = 0
            while i < n:
                driver.jit_merge_point(code=code, c=c, i=i, codes=codes, n=n)
                if code.name == "main":
                    try:
                        f(codes, codes[1], 1, c)
                    except MyExc as e:
                        c = e.c
                else:
                    llfn()
                    c -= 1
                i += 1
            raise MyExc(c)

        def main(n):
            codes = [CodeObj("main"), CodeObj("not main")]
            for code in codes:
                register_code(code, get_name)
            try:
                f(codes, codes[0], n, 8)
            except MyExc as e:
                return e.c

        null = lltype.nullptr(cintf.VMPROFSTACK)
        cintf.vmprof_tl_stack.setraw(null)
        self.meta_interp(main, [30], inline=True)
        assert visited[:3] == [[(1, 12), (1, 8)], [(1, 12), (1, 8)], [(1, 12), (1, 8)]]


    def test_leaving_with_exception_in_blackhole(self):
        visited, llfn, CodeObj, get_code_fn, get_name = self.misc
        driver = jit.JitDriver(greens=['code'], reds=['c', 'i', 'n', 'codes'])

        class MyExc(Exception):
            def __init__(self, c):
                self.c = c

        @vmprof_execute_code("main", get_code_fn,
                             _hack_update_stack_untranslated=True)
        def f(codes, code, n, c):
            i = 0
            while True:
                driver.jit_merge_point(code=code, c=c, i=i, codes=codes, n=n)
                if i >= n:
                    break
                i += 1
                if code.name == "main":
                    try:
                        f(codes, codes[1], 1, c)
                    except MyExc as e:
                        c = e.c
                    driver.can_enter_jit(code=code, c=c, i=i, codes=codes, n=n)
                else:
                    llfn()
                    c -= 1
            if c & 1:      # a failing guard
                pass
            raise MyExc(c)

        def main(n):
            codes = [CodeObj("main"), CodeObj("not main")]
            for code in codes:
                register_code(code, get_name)
            try:
                f(codes, codes[0], n, 8)
            except MyExc as e:
                return e.c

        null = lltype.nullptr(cintf.VMPROFSTACK)
        cintf.vmprof_tl_stack.setraw(null)
        self.meta_interp(main, [30], inline=True)
        assert visited[:3] == [[(1, 12), (1, 8)], [(1, 12), (1, 8)], [(1, 12), (1, 8)]]