forked from RustPython/RustPython
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcrawl_sourcecode.py
More file actions
87 lines (69 loc) · 2.17 KB
/
crawl_sourcecode.py
File metadata and controls
87 lines (69 loc) · 2.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
"""This script can be used to test the equivalence in parsing between
rustpython and cpython.
Usage example:
$ python crawl_sourcecode.py crawl_sourcecode.py > cpython.txt
$ cargo run crawl_sourcecode.py crawl_sourcecode.py > rustpython.txt
$ diff cpython.txt rustpython.txt
"""
import ast
import dis
import symtable
import sys
filename = sys.argv[1]
print("Crawling file:", filename)
with open(filename, "r") as f:
source = f.read()
t = ast.parse(source)
print(t)
shift = 3
def print_node(node, indent=0):
indents = " " * indent
if isinstance(node, ast.AST):
lineno = "row={}".format(node.lineno) if hasattr(node, "lineno") else ""
print(indents, "NODE", node.__class__.__name__, lineno)
for field in node._fields:
print(indents, "-", field)
f = getattr(node, field)
if isinstance(f, list):
for f2 in f:
print_node(f2, indent=indent + shift)
else:
print_node(f, indent=indent + shift)
else:
print(indents, "OBJ", node)
print_node(t)
# print(ast.dump(t))
flag_names = [
"is_referenced",
"is_assigned",
"is_global",
"is_local",
"is_parameter",
"is_free",
]
def print_table(table, indent=0):
indents = " " * indent
print(indents, "table:", table.get_name())
print(indents, " ", "name:", table.get_name())
print(indents, " ", "type:", table.get_type())
print(indents, " ", "line:", table.get_lineno())
print(indents, " ", "identifiers:", table.get_identifiers())
print(indents, " ", "Syms:")
for sym in table.get_symbols():
flags = []
for flag_name in flag_names:
func = getattr(sym, flag_name)
if func():
flags.append(flag_name)
print(indents, " sym:", sym.get_name(), "flags:", " ".join(flags))
if table.has_children():
print(indents, " ", "Child tables:")
for child in table.get_children():
print_table(child, indent=indent + shift)
table = symtable.symtable(source, "a", "exec")
print_table(table)
print()
print("======== dis.dis ========")
print()
co = compile(source, filename, "exec")
dis.dis(co)