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
}
}
/* Always emit an opcode event if we're tracing all opcodes. */
- if (frame->f_trace_opcodes) {
+ if (frame->f_trace_opcodes && result == 0) {
result = call_trace(func, obj, tstate, frame, trace_info, PyTrace_OPCODE, Py_None);
}
return result;