mirror of
https://github.com/python/cpython.git
synced 2025-08-24 02:35:59 +00:00
bpo-22352: Adjust widths in the output of dis.dis() for large line numbers and (#1153)
instruction offsets. Add tests for widths of opcode names.
This commit is contained in:
parent
bf623ae884
commit
d90045f319
3 changed files with 77 additions and 8 deletions
30
Lib/dis.py
30
Lib/dis.py
|
@ -175,6 +175,9 @@ _Instruction.offset.__doc__ = "Start index of operation within bytecode sequence
|
|||
_Instruction.starts_line.__doc__ = "Line started by this opcode (if any), otherwise None"
|
||||
_Instruction.is_jump_target.__doc__ = "True if other code jumps to here, otherwise False"
|
||||
|
||||
_OPNAME_WIDTH = 20
|
||||
_OPARG_WIDTH = 5
|
||||
|
||||
class Instruction(_Instruction):
|
||||
"""Details for a bytecode operation
|
||||
|
||||
|
@ -189,11 +192,12 @@ class Instruction(_Instruction):
|
|||
is_jump_target - True if other code jumps to here, otherwise False
|
||||
"""
|
||||
|
||||
def _disassemble(self, lineno_width=3, mark_as_current=False):
|
||||
def _disassemble(self, lineno_width=3, mark_as_current=False, offset_width=4):
|
||||
"""Format instruction details for inclusion in disassembly output
|
||||
|
||||
*lineno_width* sets the width of the line number field (0 omits it)
|
||||
*mark_as_current* inserts a '-->' marker arrow as part of the line
|
||||
*offset_width* sets the width of the instruction offset field
|
||||
"""
|
||||
fields = []
|
||||
# Column: Source code line number
|
||||
|
@ -214,12 +218,12 @@ class Instruction(_Instruction):
|
|||
else:
|
||||
fields.append(' ')
|
||||
# Column: Instruction offset from start of code sequence
|
||||
fields.append(repr(self.offset).rjust(4))
|
||||
fields.append(repr(self.offset).rjust(offset_width))
|
||||
# Column: Opcode name
|
||||
fields.append(self.opname.ljust(20))
|
||||
fields.append(self.opname.ljust(_OPNAME_WIDTH))
|
||||
# Column: Opcode argument
|
||||
if self.arg is not None:
|
||||
fields.append(repr(self.arg).rjust(5))
|
||||
fields.append(repr(self.arg).rjust(_OPARG_WIDTH))
|
||||
# Column: Opcode argument details
|
||||
if self.argrepr:
|
||||
fields.append('(' + self.argrepr + ')')
|
||||
|
@ -339,8 +343,19 @@ def _disassemble_bytes(code, lasti=-1, varnames=None, names=None,
|
|||
*, file=None, line_offset=0):
|
||||
# Omit the line number column entirely if we have no line number info
|
||||
show_lineno = linestarts is not None
|
||||
# TODO?: Adjust width upwards if max(linestarts.values()) >= 1000?
|
||||
lineno_width = 3 if show_lineno else 0
|
||||
if show_lineno:
|
||||
maxlineno = max(linestarts.values()) + line_offset
|
||||
if maxlineno >= 1000:
|
||||
lineno_width = len(str(maxlineno))
|
||||
else:
|
||||
lineno_width = 3
|
||||
else:
|
||||
lineno_width = 0
|
||||
maxoffset = len(code) - 2
|
||||
if maxoffset >= 10000:
|
||||
offset_width = len(str(maxoffset))
|
||||
else:
|
||||
offset_width = 4
|
||||
for instr in _get_instructions_bytes(code, varnames, names,
|
||||
constants, cells, linestarts,
|
||||
line_offset=line_offset):
|
||||
|
@ -350,7 +365,8 @@ def _disassemble_bytes(code, lasti=-1, varnames=None, names=None,
|
|||
if new_source_line:
|
||||
print(file=file)
|
||||
is_current_instr = instr.offset == lasti
|
||||
print(instr._disassemble(lineno_width, is_current_instr), file=file)
|
||||
print(instr._disassemble(lineno_width, is_current_instr, offset_width),
|
||||
file=file)
|
||||
|
||||
def _disassemble_str(source, *, file=None):
|
||||
"""Compile the source string, then disassemble the code object."""
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue