8000 Support assembly display on pdb · python/cpython@c2c2f07 · GitHub
[go: up one dir, main page]

Skip to content

Commit c2c2f07

Browse files
Support assembly display on pdb
1 parent 30a306c commit c2c2f07

File tree

1 file changed

+35
-3
lines changed

1 file changed

+35
-3
lines changed

Lib/pdb.py

Lines changed: 35 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -230,6 +230,7 @@ def __init__(self, completekey='tab', stdin=None, stdout=None, skip=None,
230230
pass
231231
self.allow_kbdint = False
232232
self.nosigint = nosigint
233+
self.assem_mode = False
233234

234235
# Read ~/.pdbrc and ./.pdbrc
235236
self.rcLines = []
@@ -1284,6 +1285,19 @@ def do_pp(self, arg):
12841285
complete_p = _complete_expression
12851286
complete_pp = _complete_expression
12861287

1288+
def do_assem(self, arg):
1289+
"""assem [on | off]
1290+
Toggle/Set assembly mode
1291+
"""
1292+
if not arg:
1293+
self.assem_mode = not self.assem_mode
1294+
elif arg == "on":
1295+
self.assem_mode = True
1296+
elif arg == "off":
1297+
self.assem_mode = False
1298+
else:
1299+
self.message("usage: assem [on | off]")
1300+
12871301
def do_list(self, arg):
12881302
"""l(ist) [first [,last] | .]
12891303
@@ -1333,7 +1347,8 @@ def do_list(self, arg):
13331347
try:
13341348
lines = linecache.getlines(filename, self.curframe.f_globals)
13351349
self._print_lines(lines[first-1:last], first, breaklist,
1336-
self.curframe)
1350+
self.curframe,
1351+
dis.get_instructions(self.curframe.f_code))
13371352
self.lineno = min(last, len(lines))
13381353
if len(lines) < last:
13391354
self.message('[EOF]')
@@ -1352,7 +1367,8 @@ def do_longlist(self, arg):
13521367
except OSError as err:
13531368
self.error(err)
13541369
return
1355-
self._print_lines(lines, lineno, breaklist, self.curframe)
1370+
self._print_lines(lines, lineno, breaklist, self.curframe,
1371+
dis.get_instructions(self.curframe.f_code))
13561372
do_ll = do_longlist
13571373

13581374
def do_source(self, arg):
@@ -1372,13 +1388,15 @@ def do_source(self, arg):
13721388

13731389
complete_source = _complete_expression
13741390

1375-
def _print_lines(self, lines, start, breaks=(), frame=None):
1391+
def _print_lines(self, lines, start, breaks=(), frame=None, instructions=None):
13761392
"""Print a range of lines."""
13771393
if frame:
13781394
current_lineno = frame.f_lineno
13791395
exc_lineno = self.tb_lineno.get(frame, -1)
13801396
else:
13811397
current_lineno = exc_lineno = -1
1398+
if self.assem_mode and instructions:
1399+
inst = next(instructions)
13821400
for lineno, line in enumerate(lines, start):
13831401
s = str(lineno).rjust(3)
13841402
if len(s) < 4:
@@ -1392,6 +1410,20 @@ def _print_lines(self, lines, start, breaks=(), frame=None):
13921410
elif lineno == exc_lineno:
13931411
s += '>>'
13941412
self.message(s + '\t' + line.rstrip())
1413+
if self.assem_mode and instructions:
1414+
while True:
1415+
if inst.positions.lineno == lineno:
1416+
current_inst = frame and frame.f_lasti == inst.offset
1417+
disassem = inst._disassemble(lineno_width=None,
1418+
mark_as_current=current_inst)
1419+
self.message(f" {disassem}")
1420+
elif inst.positions.lineno is not None and inst.positions.lineno > lineno:
1421+
break
1422+
try:
1423+
inst = next(instructions)
1424+
except StopIteration:
1425+
break
1426+
13951427

13961428
def do_whatis(self, arg):
13971429
"""whatis arg

0 commit comments

Comments
 (0)
0