@@ -199,6 +199,8 @@ def __init__(self, skip=None, backend='settrace'):
199199 self .frame_returning = None
200200 self .trace_opcodes = False
201201 self .enterframe = None
202+ self .cmdframe = None
203+ self .cmdlineno = None
202204 self .code_linenos = weakref .WeakKeyDictionary ()
203205 self .backend = backend
204206 if backend == 'monitoring' :
@@ -306,7 +308,12 @@ def dispatch_line(self, frame):
306308 self.user_line(). Raise BdbQuit if self.quitting is set.
307309 Return self.trace_dispatch to continue tracing in this scope.
308310 """
309- if self .stop_here (frame ) or self .break_here (frame ):
311+ # GH-136057
312+ # For line events, we don't want to stop at the same line where
313+ # the latest next/step command was issued.
314+ if (self .stop_here (frame ) or self .break_here (frame )) and not (
315+ self .cmdframe == frame and self .cmdlineno == frame .f_lineno
316+ ):
310317 self .user_line (frame )
311318 self .restart_events ()
312319 if self .quitting : raise BdbQuit
@@ -535,7 +542,8 @@ def _set_trace_opcodes(self, trace_opcodes):
535542 if self .monitoring_tracer :
536543 self .monitoring_tracer .update_local_events ()
537544
538- def _set_stopinfo (self , stopframe , returnframe , stoplineno = 0 , opcode = False ):
545+ def _set_stopinfo (self , stopframe , returnframe , stoplineno = 0 , opcode = False ,
546+ cmdframe = None , cmdlineno = None ):
539547 """Set the attributes for stopping.
540548
541549 If stoplineno is greater than or equal to 0, then stop at line
@@ -548,6 +556,10 @@ def _set_stopinfo(self, stopframe, returnframe, stoplineno=0, opcode=False):
548556 # stoplineno >= 0 means: stop at line >= the stoplineno
549557 # stoplineno -1 means: don't stop at all
550558 self .stoplineno = stoplineno
559+ # cmdframe/cmdlineno is the frame/line number when the user issued
560+ # step/next commands.
561+ self .cmdframe = cmdframe
562+ self .cmdlineno = cmdlineno
551563 self ._set_trace_opcodes (opcode )
552564
553565 def _set_caller_tracefunc (self , current_frame ):
@@ -573,15 +585,17 @@ def set_until(self, frame, lineno=None):
573585
574586 def set_step (self ):
575587 """Stop after one line of code."""
576- self ._set_stopinfo (None , None )
588+ # set_step() could be called from signal handler so enterframe might be None
589+ self ._set_stopinfo (None , None , cmdframe = self .enterframe ,
590+ cmdlineno = getattr (self .enterframe , 'f_lineno' , None ))
577591
578592 def set_stepinstr (self ):
579593 """Stop before the next instruction."""
580594 self ._set_stopinfo (None , None , opcode = True )
581595
582596 def set_next (self , frame ):
583597 """Stop on the next line in or below the given frame."""
584- self ._set_stopinfo (frame , None )
598+ self ._set_stopinfo (frame , None , cmdframe = frame , cmdlineno = frame . f_lineno )
585599
586600 def set_return (self , frame ):
587601 """Stop when returning from the given frame."""
0 commit comments