forked from ethanchewy/PythonBuddy
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtest_framestate.py
More file actions
95 lines (83 loc) · 3.06 KB
/
test_framestate.py
File metadata and controls
95 lines (83 loc) · 3.06 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
from rpython.flowspace.model import *
from rpython.rlib.unroll import SpecTag
from rpython.flowspace.flowcontext import FlowContext
from rpython.flowspace.bytecode import HostCode
from rpython.flowspace.pygraph import PyGraph
class TestFrameState:
def get_context(self, func):
try:
func = func.im_func
except AttributeError:
pass
code = HostCode._from_code(func.func_code)
graph = PyGraph(func, code)
ctx = FlowContext(graph, code)
# hack the frame
ctx.setstate(graph.startblock.framestate)
ctx.locals_w[-1] = Constant(None)
return ctx
def func_simple(x):
spam = 5
return spam
def test_eq_framestate(self):
ctx = self.get_context(self.func_simple)
fs1 = ctx.getstate(0)
fs2 = ctx.getstate(0)
assert fs1.matches(fs2)
def test_neq_hacked_framestate(self):
ctx = self.get_context(self.func_simple)
fs1 = ctx.getstate(0)
ctx.locals_w[-1] = Variable()
fs2 = ctx.getstate(0)
assert not fs1.matches(fs2)
def test_union_on_equal_framestates(self):
ctx = self.get_context(self.func_simple)
fs1 = ctx.getstate(0)
fs2 = ctx.getstate(0)
assert fs1.union(fs2).matches(fs1)
def test_union_on_hacked_framestates(self):
ctx = self.get_context(self.func_simple)
fs1 = ctx.getstate(0)
ctx.locals_w[-1] = Variable()
fs2 = ctx.getstate(0)
assert fs1.union(fs2).matches(fs2) # fs2 is more general
assert fs2.union(fs1).matches(fs2) # fs2 is more general
def test_restore_frame(self):
ctx = self.get_context(self.func_simple)
fs1 = ctx.getstate(0)
ctx.locals_w[-1] = Variable()
ctx.setstate(fs1)
assert fs1.matches(ctx.getstate(0))
def test_copy(self):
ctx = self.get_context(self.func_simple)
fs1 = ctx.getstate(0)
fs2 = fs1.copy()
assert fs1.matches(fs2)
def test_getvariables(self):
ctx = self.get_context(self.func_simple)
fs1 = ctx.getstate(0)
vars = fs1.getvariables()
assert len(vars) == 1
def test_getoutputargs(self):
ctx = self.get_context(self.func_simple)
fs1 = ctx.getstate(0)
ctx.locals_w[-1] = Variable()
fs2 = ctx.getstate(0)
outputargs = fs1.getoutputargs(fs2)
# 'x' -> 'x' is a Variable
# locals_w[n-1] -> locals_w[n-1] is Constant(None)
assert outputargs == [ctx.locals_w[0], Constant(None)]
def test_union_different_constants(self):
ctx = self.get_context(self.func_simple)
fs1 = ctx.getstate(0)
ctx.locals_w[-1] = Constant(42)
fs2 = ctx.getstate(0)
fs3 = fs1.union(fs2)
ctx.setstate(fs3)
assert isinstance(ctx.locals_w[-1], Variable) # generalized
def test_union_spectag(self):
ctx = self.get_context(self.func_simple)
fs1 = ctx.getstate(0)
ctx.locals_w[-1] = Constant(SpecTag())
fs2 = ctx.getstate(0)
assert fs1.union(fs2) is None # UnionError