mirror of https://github.com/python/cpython
GH-96864: Check for error between line and opcode events (GH-96880)
This commit is contained in:
parent
5b3a2569f4
commit
c10e33ac11
|
@ -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
|
||||
|
|
|
@ -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.
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue