mirror of
https://github.com/python/cpython.git
synced 2025-09-27 02:39:58 +00:00
Add a helper to display the various flags and components of code objects
(everything besides the actual code disassembly).
This commit is contained in:
parent
dc089b6d07
commit
3e1b85ead1
1 changed files with 56 additions and 0 deletions
56
Lib/dis.py
56
Lib/dis.py
|
@ -55,6 +55,62 @@ def distb(tb=None):
|
||||||
while tb.tb_next: tb = tb.tb_next
|
while tb.tb_next: tb = tb.tb_next
|
||||||
disassemble(tb.tb_frame.f_code, tb.tb_lasti)
|
disassemble(tb.tb_frame.f_code, tb.tb_lasti)
|
||||||
|
|
||||||
|
# XXX This duplicates information from code.h, also duplicated in inspect.py.
|
||||||
|
# XXX Maybe this ought to be put in a central location, like opcode.py?
|
||||||
|
flag2name = {
|
||||||
|
1: "OPTIMIZED",
|
||||||
|
2: "NEWLOCALS",
|
||||||
|
4: "VARARGS",
|
||||||
|
8: "VARKEYWORDS",
|
||||||
|
16: "NESTED",
|
||||||
|
32: "GENERATOR",
|
||||||
|
64: "NOFREE",
|
||||||
|
}
|
||||||
|
|
||||||
|
def pretty_flags(flags):
|
||||||
|
"""Return pretty representation of code flags."""
|
||||||
|
names = []
|
||||||
|
for i in range(32):
|
||||||
|
flag = 1<<i
|
||||||
|
if flags & flag:
|
||||||
|
names.append(flag2name.get(flag, hex(flag)))
|
||||||
|
flags ^= flag
|
||||||
|
if not flags:
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
names.append(hex(flags))
|
||||||
|
return ", ".join(names)
|
||||||
|
|
||||||
|
def show_code(co):
|
||||||
|
"""Show details about a code object."""
|
||||||
|
print("Name: ", co.co_name)
|
||||||
|
print("Filename: ", co.co_filename)
|
||||||
|
print("Argument count: ", co.co_argcount)
|
||||||
|
print("Kw-only arguments:", co.co_kwonlyargcount)
|
||||||
|
print("Number of locals: ", co.co_nlocals)
|
||||||
|
print("Stack size: ", co.co_stacksize)
|
||||||
|
print("Flags: ", pretty_flags(co.co_flags))
|
||||||
|
if co.co_consts:
|
||||||
|
print("Constants:")
|
||||||
|
for i_c in enumerate(co.co_consts):
|
||||||
|
print("%4d: %r" % i_c)
|
||||||
|
if co.co_names:
|
||||||
|
print("Names:")
|
||||||
|
for i_n in enumerate(co.co_names):
|
||||||
|
print("%4d: %s" % i_n)
|
||||||
|
if co.co_varnames:
|
||||||
|
print("Variable names:")
|
||||||
|
for i_n in enumerate(co.co_varnames):
|
||||||
|
print("%4d: %s" % i_n)
|
||||||
|
if co.co_freevars:
|
||||||
|
print("Free variables:")
|
||||||
|
for i_n in enumerate(co.co_freevars):
|
||||||
|
print("%4d: %s" % i_n)
|
||||||
|
if co.co_cellvars:
|
||||||
|
print("Cell variables:")
|
||||||
|
for i_n in enumerate(co.co_cellvars):
|
||||||
|
print("%4d: %s" % i_n)
|
||||||
|
|
||||||
def disassemble(co, lasti=-1):
|
def disassemble(co, lasti=-1):
|
||||||
"""Disassemble a code object."""
|
"""Disassemble a code object."""
|
||||||
code = co.co_code
|
code = co.co_code
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue