8000 gh-120144: Refactor bdb monitoring backend to match settrace behavior by gaogaotiantian · Pull Request #132484 · python/cpython · GitHub
[go: up one dir, main page]

Skip to content

gh-120144: Refactor bdb monitoring backend to match settrace behavior #132484

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Apr 13, 2025
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 12 additions & 23 deletions Lib/bdb.py
Original file line number Diff line number Diff line change
Expand Up @@ -62,8 +62,7 @@ def start_trace(self, tracefunc):
sys.monitoring.register_callback(self._tool_id, event, callback)
if event != E.INSTRUCTION:
all_events |= event
self.check_trace_func()
self.check_trace_opcodes()
self.update_local_events()
sys.monitoring.set_events(self._tool_id, self.GLOBAL_EVENTS)
self._enabled = True

Expand All @@ -74,7 +73,6 @@ def stop_trace(self):
if curr_tool != self._name:
return
sys.monitoring.clear_tool_id(self._tool_id)
self.check_trace_opcodes()
sys.monitoring.free_tool_id(self._tool_id)

def disable_current_event(self):
Expand All @@ -95,7 +93,7 @@ def wrapper(self, *args):
frame = sys._getframe().f_back
ret = func(self, frame, *args)
if self._enabled and frame.f_trace:
self.check_trace_func()
self.update_local_events()
if self._disable_current_event:
return sys.monitoring.DISABLE
else:
Expand Down Expand Up @@ -159,27 +157,18 @@ def opcode_callback(self, frame, code, offset):
if frame.f_trace and frame.f_trace_opcodes:
frame.f_trace(frame, 'opcode', None)

def check_trace_opcodes(self, frame=None):
if frame is None:
frame = sys._getframe().f_back
while frame is not None:
self.set_trace_opcodes(frame, frame.f_trace_opcodes)
frame = frame.f_back

def set_trace_opcodes(self, frame, trace_opcodes):
def update_local_events(self, frame=None):
if sys.monitoring.get_tool(self._tool_id) != self._name:
return
if trace_opcodes:
sys.monitoring.set_local_events(self._tool_id, frame.f_code, E.INSTRUCTION)
else:
sys.monitoring.set_local_events(self._tool_id, frame.f_code, 0)

def check_trace_func(self, frame=None):
if frame is None:
frame = sys._getframe().f_back
while frame is not None:
if frame.f_trace is not None:
sys.monitoring.set_local_events(self._tool_id, frame.f_code, self.LOCAL_EVENTS)
if frame.f_trace_opcodes:
events = self.LOCAL_EVENTS | E.INSTRUCTION
else:
events = self.LOCAL_EVENTS
sys.monitoring.set_local_events(self._tool_id, frame.f_code, events)
frame = frame.f_back

def _get_lineno(self, code, offset):
Expand Down Expand Up @@ -544,11 +533,11 @@ def _set_trace_opcodes(self, trace_opcodes):
frame = self.enterframe
while frame is not None:
frame.f_trace_opcodes = trace_opcodes
if self.monitoring_tracer:
self.monitoring_tracer.set_trace_opcodes(frame, trace_opcodes)
if frame is self.botframe:
break
frame = frame.f_back
if self.monitoring_tracer:
self.monitoring_tracer.update_local_events()

def _set_stopinfo(self, stopframe, returnframe, stoplineno=0, opcode=False):
"""Set the attributes for stopping.
Expand Down Expand Up @@ -642,8 +631,8 @@ def set_continue(self):
frame = frame.f_back
for frame, (trace_lines, trace_opcodes) in self.frame_trace_lines_opcodes.items():
frame.f_trace_lines, frame.f_trace_opcodes = trace_lines, trace_opcodes
if self.backend == 'monitoring':
self.monitoring_tracer.set_trace_opcodes(frame, trace_opcodes)
if self.backend == 'monitoring':
self.monitoring_tracer.update_local_events()
self.frame_trace_lines_opcodes = {}

def set_quit(self):
Expand Down
Loading
0