GH-96864: Check for error between line and opcode events (GH-96880)

This commit is contained in:
Brandt Bucher 2022-09-19 14:02:24 -07:00 committed by GitHub
parent 5b3a2569f4
commit c10e33ac11
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 17 additions and 1 deletions

View File

@ -1721,6 +1721,20 @@ class RaisingTraceFuncTestCase(unittest.TestCase):
finally:
sys.settrace(existing)
def test_line_event_raises_before_opcode_event(self):
exception = ValueError("BOOM!")
def trace(frame, event, arg):
if event == "line":
raise exception
frame.f_trace_opcodes = True
return trace
def f():
pass
with self.assertRaises(ValueError) as caught:
sys.settrace(trace)
f()
self.assertIs(caught.exception, exception)
# 'Jump' tests: assigning to frame.f_lineno within a trace function
# moves the execution position - it's how debuggers implement a Jump

View File

@ -0,0 +1,2 @@
Fix a possible assertion failure, fatal error, or :exc:`SystemError` if a
line tracing event raises an exception while opcode tracing is enabled.

View File

@ -6293,7 +6293,7 @@ maybe_call_line_trace(Py_tracefunc func, PyObject *obj,
}
}
/* Always emit an opcode event if we're tracing all opcodes. */
if (f->f_trace_opcodes) {
if (f->f_trace_opcodes && result == 0) {
result = call_trace(func, obj, tstate, frame, PyTrace_OPCODE, Py_None);
}
return result;