Commit 09c8123e authored by Nick Coghlan's avatar Nick Coghlan

Address XXX comment in dis.py: inspect.py now attempts to reuse the dis.py...

Address XXX comment in dis.py: inspect.py now attempts to reuse the dis.py compiler flag values before resorting to defining its own
parent 77203adb
...@@ -68,9 +68,10 @@ def distb(tb=None): ...@@ -68,9 +68,10 @@ 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. # The inspect module interrogates this dictionary to build its
# XXX Maybe this ought to be put in a central location, like opcode.py? # list of CO_* constants. It is also used by pretty_flags to
flag2name = { # turn the co_flags field into a human readable list.
COMPILER_FLAG_NAMES = {
1: "OPTIMIZED", 1: "OPTIMIZED",
2: "NEWLOCALS", 2: "NEWLOCALS",
4: "VARARGS", 4: "VARARGS",
...@@ -86,7 +87,7 @@ def pretty_flags(flags): ...@@ -86,7 +87,7 @@ def pretty_flags(flags):
for i in range(32): for i in range(32):
flag = 1<<i flag = 1<<i
if flags & flag: if flags & flag:
names.append(flag2name.get(flag, hex(flag))) names.append(COMPILER_FLAG_NAMES.get(flag, hex(flag)))
flags ^= flag flags ^= flag
if not flags: if not flags:
break break
......
...@@ -36,15 +36,25 @@ import types ...@@ -36,15 +36,25 @@ import types
import itertools import itertools
import string import string
import re import re
import dis
import imp import imp
import tokenize import tokenize
import linecache import linecache
from operator import attrgetter from operator import attrgetter
from collections import namedtuple from collections import namedtuple
# These constants are from Include/code.h.
CO_OPTIMIZED, CO_NEWLOCALS, CO_VARARGS, CO_VARKEYWORDS = 0x1, 0x2, 0x4, 0x8 # Create constants for the compiler flags in Include/code.h
CO_NESTED, CO_GENERATOR, CO_NOFREE = 0x10, 0x20, 0x40 # We try to get them from dis to avoid duplication, but fall
# back to hardcording so the dependency is optional
try:
from dis import COMPILER_FLAG_NAMES as _flag_names
except ImportError:
CO_OPTIMIZED, CO_NEWLOCALS = 0x1, 0x2
CO_VARARGS, CO_VARKEYWORDS = 0x4, 0x8
CO_NESTED, CO_GENERATOR, CO_NOFREE = 0x10, 0x20, 0x40
else:
mod_dict = globals()
for k, v in _flag_names.items():
mod_dict["CO_" + v] = k
# See Include/object.h # See Include/object.h
TPFLAGS_IS_ABSTRACT = 1 << 20 TPFLAGS_IS_ABSTRACT = 1 << 20
......
...@@ -90,6 +90,9 @@ Extensions ...@@ -90,6 +90,9 @@ Extensions
Library Library
------- -------
- Address XXX comment in dis.py by having inspect.py prefer to reuse the
dis.py compiler flag values over defining its own
- Issue #9147: Added dis.code_info() which is similar to show_code() - Issue #9147: Added dis.code_info() which is similar to show_code()
but returns formatted code information in a string rather than but returns formatted code information in a string rather than
displaying on screen. displaying on screen.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment