@@ -230,6 +230,7 @@ def __init__(self, completekey='tab', stdin=None, stdout=None, skip=None,
230
230
pass
231
231
self .allow_kbdint = False
232
232
self .nosigint = nosigint
233
+ self .assem_mode = False
233
234
234
235
# Read ~/.pdbrc and ./.pdbrc
235
236
self .rcLines = []
@@ -1284,6 +1285,19 @@ def do_pp(self, arg):
1284
1285
complete_p = _complete_expression
1285
1286
complete_pp = _complete_expression
1286
1287
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
+
1287
1301
def do_list (self , arg ):
1288
1302
"""l(ist) [first [,last] | .]
1289
1303
@@ -1333,7 +1347,8 @@ def do_list(self, arg):
1333
1347
try :
1334
1348
lines = linecache .getlines (filename , self .curframe .f_globals )
1335
1349
self ._print_lines (lines [first - 1 :last ], first , breaklist ,
1336
- self .curframe )
1350
+ self .curframe ,
1351
+ dis .get_instructions (self .curframe .f_code ))
1337
1352
self .lineno = min (last , len (lines ))
1338
1353
if len (lines ) < last :
1339
1354
self .message ('[EOF]' )
@@ -1352,7 +1367,8 @@ def do_longlist(self, arg):
1352
1367
except OSError as err :
1353
1368
self .error (err )
1354
1369
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 ))
1356
1372
do_ll = do_longlist
1357
1373
1358
1374
def do_source (self , arg ):
@@ -1372,13 +1388,15 @@ def do_source(self, arg):
1372
1388
1373
1389
complete_source = _complete_expression
1374
1390
1375
- def _print_lines (self , lines , start , breaks = (), frame = None ):
1391
+ def _print_lines (self , lines , start , breaks = (), frame = None , instructions = None ):
1376
1392
"""Print a range of lines."""
1377
1393
if frame :
1378
1394
current_lineno = frame .f_lineno
1379
1395
exc_lineno = self .tb_lineno .get (frame , - 1 )
1380
1396
else :
1381
1397
current_lineno = exc_lineno = - 1
1398
+ if self .assem_mode and instructions :
1399
+ inst = next (instructions )
1382
1400
for lineno , line in enumerate (lines , start ):
1383
1401
s = str (lineno ).rjust (3 )
1384
1402
if len (s ) < 4 :
@@ -1392,6 +1410,20 @@ def _print_lines(self, lines, start, breaks=(), frame=None):
1392
1410
elif lineno == exc_lineno :
1393
1411
s += '>>'
1394
1412
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
+
1395
1427
1396
1428
def do_whatis (self , arg ):
1397
1429
"""whatis arg
0 commit comments