mirror of
https://github.com/python/cpython.git
synced 2025-07-24 11:44:31 +00:00
gh-94215: Fix error handling for line-tracing events (GH-94681)
* Re-enable crasher * Fix error handling for line-tracing events * blurb add
This commit is contained in:
parent
e5b841a403
commit
23ee4a8067
3 changed files with 17 additions and 6 deletions
|
@ -5683,16 +5683,25 @@ handle_eval_breaker:
|
|||
err = maybe_call_line_trace(tstate->c_tracefunc,
|
||||
tstate->c_traceobj,
|
||||
tstate, frame, instr_prev);
|
||||
// Reload possibly changed frame fields:
|
||||
stack_pointer = _PyFrame_GetStackPointer(frame);
|
||||
frame->stacktop = -1;
|
||||
// next_instr is only reloaded if tracing *does not* raise.
|
||||
// This is consistent with the behavior of older Python
|
||||
// versions. If a trace function sets a new f_lineno and
|
||||
// *then* raises, we use the *old* location when searching
|
||||
// for an exception handler, displaying the traceback, and
|
||||
// so on:
|
||||
if (err) {
|
||||
/* trace function raised an exception */
|
||||
// next_instr wasn't incremented at the start of this
|
||||
// instruction. Increment it before handling the error,
|
||||
// so that it looks the same as a "normal" instruction:
|
||||
next_instr++;
|
||||
goto error;
|
||||
}
|
||||
/* Reload possibly changed frame fields */
|
||||
// Reload next_instr. Don't increment it, though, since
|
||||
// we're going to re-dispatch to the "true" instruction now:
|
||||
next_instr = frame->prev_instr;
|
||||
|
||||
stack_pointer = _PyFrame_GetStackPointer(frame);
|
||||
frame->stacktop = -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue