Skip to content

Commit 61b35f7

Browse files
gh-128991: Release the enter frame reference within bdb callback (#128992)
* Release the enter frame reference within bdb callback * 📜🤖 Added by blurb_it. --------- Co-authored-by: blurb-it[bot] <43283697+blurb-it[bot]@users.noreply.github.com>
1 parent e8092e5 commit 61b35f7

File tree

2 files changed

+37
-32
lines changed

2 files changed

+37
-32
lines changed

Lib/bdb.py

+36-32
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import sys
55
import os
66
import weakref
7+
from contextlib import contextmanager
78
from inspect import CO_GENERATOR, CO_COROUTINE, CO_ASYNC_GENERATOR
89

910
__all__ = ["BdbQuit", "Bdb", "Breakpoint"]
@@ -65,6 +66,12 @@ def reset(self):
6566
self.botframe = None
6667
self._set_stopinfo(None, None)
6768

69+
@contextmanager
70+
def set_enterframe(self, frame):
71+
self.enterframe = frame
72+
yield
73+
self.enterframe = None
74+
6875
def trace_dispatch(self, frame, event, arg):
6976
"""Dispatch a trace function for debugged frames based on the event.
7077
@@ -90,28 +97,27 @@ def trace_dispatch(self, frame, event, arg):
9097
The arg parameter depends on the previous event.
9198
"""
9299

93-
self.enterframe = frame
94-
95-
if self.quitting:
96-
return # None
97-
if event == 'line':
98-
return self.dispatch_line(frame)
99-
if event == 'call':
100-
return self.dispatch_call(frame, arg)
101-
if event == 'return':
102-
return self.dispatch_return(frame, arg)
103-
if event == 'exception':
104-
return self.dispatch_exception(frame, arg)
105-
if event == 'c_call':
106-
return self.trace_dispatch
107-
if event == 'c_exception':
108-
return self.trace_dispatch
109-
if event == 'c_return':
100+
with self.set_enterframe(frame):
101+
if self.quitting:
102+
return # None
103+
if event == 'line':
104+
return self.dispatch_line(frame)
105+
if event == 'call':
106+
return self.dispatch_call(frame, arg)
107+
if event == 'return':
108+
return self.dispatch_return(frame, arg)
109+
if event == 'exception':
110+
return self.dispatch_exception(frame, arg)
111+
if event == 'c_call':
112+
return self.trace_dispatch
113+
if event == 'c_exception':
114+
return self.trace_dispatch
115+
if event == 'c_return':
116+
return self.trace_dispatch
117+
if event == 'opcode':
118+
return self.dispatch_opcode(frame, arg)
119+
print('bdb.Bdb.dispatch: unknown debugging event:', repr(event))
110120
return self.trace_dispatch
111-
if event == 'opcode':
112-
return self.dispatch_opcode(frame, arg)
113-
print('bdb.Bdb.dispatch: unknown debugging event:', repr(event))
114-
return self.trace_dispatch
115121

116122
def dispatch_line(self, frame):
117123
"""Invoke user function and return trace function for line event.
@@ -395,16 +401,15 @@ def set_trace(self, frame=None):
395401
if frame is None:
396402
frame = sys._getframe().f_back
397403
self.reset()
398-
self.enterframe = frame
399-
while frame:
400-
frame.f_trace = self.trace_dispatch
401-
self.botframe = frame
402-
self.frame_trace_lines_opcodes[frame] = (frame.f_trace_lines, frame.f_trace_opcodes)
403-
# We need f_trace_lines == True for the debugger to work
404-
frame.f_trace_lines = True
405-
frame = frame.f_back
406-
self.set_stepinstr()
407-
self.enterframe = None
404+
with self.set_enterframe(frame):
405+
while frame:
406+
frame.f_trace = self.trace_dispatch
407+
self.botframe = frame
408+
self.frame_trace_lines_opcodes[frame] = (frame.f_trace_lines, frame.f_trace_opcodes)
409+
# We need f_trace_lines == True for the debugger to work
410+
frame.f_trace_lines = True
411+
frame = frame.f_back
412+
self.set_stepinstr()
408413
sys.settrace(self.trace_dispatch)
409414

410415
def set_continue(self):
@@ -424,7 +429,6 @@ def set_continue(self):
424429
for frame, (trace_lines, trace_opcodes) in self.frame_trace_lines_opcodes.items():
425430
frame.f_trace_lines, frame.f_trace_opcodes = trace_lines, trace_opcodes
426431
self.frame_trace_lines_opcodes = {}
427-
self.enterframe = None
428432

429433
def set_quit(self):
430434
"""Set quitting attribute to True.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Release the enter frame reference within :mod:`bdb` callback

0 commit comments

Comments
 (0)