forked from aosabook/500lines
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdriver.py
More file actions
56 lines (47 loc) · 1.29 KB
/
Copy pathdriver.py
File metadata and controls
56 lines (47 loc) · 1.29 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
"""
Test-drive the byte-compiler.
(You can do it directly with python compiler.py foo.py [arguments...],
but this way there's some debug scaffolding.)
"""
import ast, dis, sys, types
import compiler
loud = 0
if loud:
report = print
else:
def report(*args, **kwargs): pass
def run(module_name, filename, source):
f = compile_toplevel(module_name, filename, source)
f() # It's alive!
def compile_toplevel(module_name, filename, source):
t = ast.parse(source)
try:
import astpp
except ImportError:
astpp = ast
report(astpp.dump(t))
their_globals = compiler.make_globals(module_name)
f = compiler.byte_compile(module_name, filename, t, their_globals)
diss(f.__code__)
return f
def diss(code):
codepp(code)
if loud: dis.dis(code)
for c in code.co_consts:
if isinstance(c, types.CodeType):
report()
report('------', c, '------')
diss(c)
def codepp(code):
for k in dir(code):
if k.startswith('co_'):
report(k, getattr(code, k))
if __name__ == '__main__':
if len(sys.argv) >= 2:
del sys.argv[0]
filename = sys.argv[0]
with open(filename) as f:
source = f.read()
run("XXX", filename, source)
else:
assert False