summaryrefslogtreecommitdiffstats
path: root/Lib/dis.py
diff options
context:
space:
mode:
authorNick Coghlan <ncoghlan@gmail.com>2013-11-22 14:57:00 (GMT)
committerNick Coghlan <ncoghlan@gmail.com>2013-11-22 14:57:00 (GMT)
commit50c48b89e3e3399a729f72983bc47996b5c50545 (patch)
tree3017accfaf672975f776227661a1e412b210eb13 /Lib/dis.py
parent8fbdb097cfc6a838a6a447e4a6c7ad497c392ad6 (diff)
downloadcpython-50c48b89e3e3399a729f72983bc47996b5c50545.zip
cpython-50c48b89e3e3399a729f72983bc47996b5c50545.tar.gz
cpython-50c48b89e3e3399a729f72983bc47996b5c50545.tar.bz2
Close #17916: dis.Bytecode based replacement for distb
- Bytecode.from_traceback() alternate constructor - current_offset parameter and attribute Patch by Claudiu Popa
Diffstat (limited to 'Lib/dis.py')
-rw-r--r--Lib/dis.py17
1 files changed, 15 insertions, 2 deletions
diff --git a/Lib/dis.py b/Lib/dis.py
index 1fafcc5..81cbe7f 100644
--- a/Lib/dis.py
+++ b/Lib/dis.py
@@ -406,7 +406,7 @@ class Bytecode:
Iterating over this yields the bytecode operations as Instruction instances.
"""
- def __init__(self, x, *, first_line=None):
+ def __init__(self, x, *, first_line=None, current_offset=None):
self.codeobj = co = _get_code_object(x)
if first_line is None:
self.first_line = co.co_firstlineno
@@ -417,6 +417,7 @@ class Bytecode:
self._cell_names = co.co_cellvars + co.co_freevars
self._linestarts = dict(findlinestarts(co))
self._original_object = x
+ self.current_offset = current_offset
def __iter__(self):
co = self.codeobj
@@ -429,6 +430,13 @@ class Bytecode:
return "{}({!r})".format(self.__class__.__name__,
self._original_object)
+ @classmethod
+ def from_traceback(cls, tb):
+ """ Construct a Bytecode from the given traceback """
+ while tb.tb_next:
+ tb = tb.tb_next
+ return cls(tb.tb_frame.f_code, current_offset=tb.tb_lasti)
+
def info(self):
"""Return formatted information about the code object."""
return _format_code_info(self.codeobj)
@@ -436,13 +444,18 @@ class Bytecode:
def dis(self):
"""Return a formatted view of the bytecode operations."""
co = self.codeobj
+ if self.current_offset is not None:
+ offset = self.current_offset
+ else:
+ offset = -1
with io.StringIO() as output:
_disassemble_bytes(co.co_code, varnames=co.co_varnames,
names=co.co_names, constants=co.co_consts,
cells=self._cell_names,
linestarts=self._linestarts,
line_offset=self._line_offset,
- file=output)
+ file=output,
+ lasti=offset)
return output.getvalue()