forked from ethanchewy/PythonBuddy
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtest_rvmprof.py
More file actions
158 lines (129 loc) · 5.17 KB
/
test_rvmprof.py
File metadata and controls
158 lines (129 loc) · 5.17 KB
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)]]