3
3
import fnmatch
4
4
import sys
5
5
import os
6
+ from contextlib import contextmanager
6
7
from inspect import CO_GENERATOR , CO_COROUTINE , CO_ASYNC_GENERATOR
7
8
8
9
__all__ = ["BdbQuit" , "Bdb" , "Breakpoint" ]
@@ -60,6 +61,12 @@ def reset(self):
60
61
self .botframe = None
61
62
self ._set_stopinfo (None , None )
62
63
64
+ @contextmanager
65
+ def set_enterframe (self , frame ):
66
+ self .enterframe = frame
67
+ yield
68
+ self .enterframe = None
69
+
63
70
def trace_dispatch (self , frame , event , arg ):
64
71
"""Dispatch a trace function for debugged frames based on the event.
65
72
@@ -84,24 +91,26 @@ def trace_dispatch(self, frame, event, arg):
84
91
85
92
The arg parameter depends on the previous event.
86
93
"""
87
- if self .quitting :
88
- return # None
89
- if event == 'line' :
90
- return self .dispatch_line (frame )
91
- if event == 'call' :
92
- return self .dispatch_call (frame , arg )
93
- if event == 'return' :
94
- return self .dispatch_return (frame , arg )
95
- if event == 'exception' :
96
- return self .dispatch_exception (frame , arg )
97
- if event == 'c_call' :
98
- return self .trace_dispatch
99
- if event == 'c_exception' :
100
- return self .trace_dispatch
101
- if event == 'c_return' :
94
+
95
+ with self .set_enterframe (frame ):
96
+ if self .quitting :
97
+ return # None
98
+ if event == 'line' :
99
+ return self .dispatch_line (frame )
100
+ if event == 'call' :
101
+ return self .dispatch_call (frame , arg )
102
+ if event == 'return' :
103
+ return self .dispatch_return (frame , arg )
104
+ if event == 'exception' :
105
+ return self .dispatch_exception (frame , arg )
106
+ if event == 'c_call' :
107
+ return self .trace_dispatch
108
+ if event == 'c_exception' :
109
+ return self .trace_dispatch
110
+ if event == 'c_return' :
111
+ return self .trace_dispatch
112
+ print ('bdb.Bdb.dispatch: unknown debugging event:' , repr (event ))
102
113
return self .trace_dispatch
103
- print ('bdb.Bdb.dispatch: unknown debugging event:' , repr (event ))
104
- return self .trace_dispatch
105
114
106
115
def dispatch_line (self , frame ):
107
116
"""Invoke user function and return trace function for line event.
@@ -335,12 +344,12 @@ def set_trace(self, frame=None):
335
344
if frame is None :
336
345
frame = sys ._getframe ().f_back
337
346
self .reset ()
338
- while frame :
339
- frame . f_trace = self . trace_dispatch
340
- self . botframe = frame
341
- frame = frame . f_back
342
- self . set_step ()
343
- self . enterframe = None
347
+ with self . set_enterframe ( frame ) :
348
+ while frame :
349
+ frame . f_trace = self . trace_dispatch
350
+ self . botframe = frame
351
+ frame = frame . f_back
352
+ self . set_step ()
344
353
sys .settrace (self .trace_dispatch )
345
354
346
355
def set_continue (self ):
@@ -357,7 +366,6 @@ def set_continue(self):
357
366
while frame and frame is not self .botframe :
358
367
del frame .f_trace
359
368
frame = frame .f_back
360
- self .enterframe = None
361
369
362
370
def set_quit (self ):
363
371
"""Set quitting attribute to True.
0 commit comments