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
|
# Check that we have sensical bytecode offsets in function.__code__.co_lines
def f1(x, y, obj, obj2, obj3):
a = x + y # line 4: bc+4 line+4
b = x - y # line 5: bc+4 line+1
# line 6
# line 7
# line 8
# line 9
# line 10
# line 11
# line 12
# line 13
# line 14
# line 15
# line 16
# line 17
# line 18
# line 19
c = a * b # line 20: bc+4 line+15
obj.a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z.fun() # line 21: bc+31 line+1; bc+27 line+0
# line 22
# line 23
# line 24: bc+0 line+3
# line 25
# line 26
# line 27: bc+0 line+3
# line 28
# line 29
obj2.a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z.fun() # line 30: bc+31 line+3; bc+27 line+0
# line 31
# line 32
# line 33: bc+0 line+3
# line 34
# line 35
# line 36
# line 37
# line 38
# line 39
# line 40
# line 41
# line 42
# line 43
# line 44
# line 45
# line 46
# line 47
# line 48
# line 49
# line 50
# line 51
# line 52
# line 53
# line 54
# line 55
# line 56
# line 57
# line 58
# line 59
return obj3.a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z.fun() # line 60: bc+31 line+27; bc+27 line+0
def f2(x, y):
a = x + y # line 63
b = x - y # line 64
return a * b # line 65
try:
f1.__code__.co_lines
except AttributeError:
print("SKIP")
raise SystemExit
print("f1")
for start, end, line_no in f1.__code__.co_lines():
print("line {} start: {}".format(line_no, start))
print("line {} end: {}".format(line_no, end))
print("f2")
for start, end, line_no in f2.__code__.co_lines():
print("line {} start: {}".format(line_no, start))
print("line {} end: {}".format(line_no, end))
|