mirror of
https://github.com/python/cpython.git
synced 2025-08-03 16:39:00 +00:00
GH-106897: Add RERAISE
event to sys.monitoring
. (GH-107291)
* Ensures that exception handling events are balanced. Each [re]raise event has a matching unwind/handled event.
This commit is contained in:
parent
f84d77b4e0
commit
766d2518ae
8 changed files with 231 additions and 44 deletions
|
@ -720,7 +720,11 @@ dummy_func(
|
|||
exc = args[0];
|
||||
/* fall through */
|
||||
case 0:
|
||||
ERROR_IF(do_raise(tstate, exc, cause), exception_unwind);
|
||||
if (do_raise(tstate, exc, cause)) {
|
||||
assert(oparg == 0);
|
||||
monitor_reraise(tstate, frame, next_instr-1);
|
||||
goto exception_unwind;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
_PyErr_SetString(tstate, PyExc_SystemError,
|
||||
|
@ -1047,6 +1051,7 @@ dummy_func(
|
|||
assert(exc && PyExceptionInstance_Check(exc));
|
||||
Py_INCREF(exc);
|
||||
_PyErr_SetRaisedException(tstate, exc);
|
||||
monitor_reraise(tstate, frame, next_instr-1);
|
||||
goto exception_unwind;
|
||||
}
|
||||
|
||||
|
@ -1058,6 +1063,7 @@ dummy_func(
|
|||
else {
|
||||
Py_INCREF(exc);
|
||||
_PyErr_SetRaisedException(tstate, exc);
|
||||
monitor_reraise(tstate, frame, next_instr-1);
|
||||
goto exception_unwind;
|
||||
}
|
||||
}
|
||||
|
@ -1072,6 +1078,7 @@ dummy_func(
|
|||
}
|
||||
else {
|
||||
_PyErr_SetRaisedException(tstate, Py_NewRef(exc_value));
|
||||
monitor_reraise(tstate, frame, next_instr-1);
|
||||
goto exception_unwind;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -184,6 +184,9 @@ lltrace_resume_frame(_PyInterpreterFrame *frame)
|
|||
static void monitor_raise(PyThreadState *tstate,
|
||||
_PyInterpreterFrame *frame,
|
||||
_Py_CODEUNIT *instr);
|
||||
static void monitor_reraise(PyThreadState *tstate,
|
||||
_PyInterpreterFrame *frame,
|
||||
_Py_CODEUNIT *instr);
|
||||
static int monitor_stop_iteration(PyThreadState *tstate,
|
||||
_PyInterpreterFrame *frame,
|
||||
_Py_CODEUNIT *instr);
|
||||
|
@ -840,7 +843,6 @@ error:
|
|||
}
|
||||
}
|
||||
monitor_raise(tstate, frame, next_instr-1);
|
||||
|
||||
exception_unwind:
|
||||
{
|
||||
/* We can't use frame->f_lasti here, as RERAISE may have set it */
|
||||
|
@ -1954,6 +1956,16 @@ monitor_raise(PyThreadState *tstate, _PyInterpreterFrame *frame,
|
|||
do_monitor_exc(tstate, frame, instr, PY_MONITORING_EVENT_RAISE);
|
||||
}
|
||||
|
||||
static void
|
||||
monitor_reraise(PyThreadState *tstate, _PyInterpreterFrame *frame,
|
||||
_Py_CODEUNIT *instr)
|
||||
{
|
||||
if (no_tools_for_event(tstate, frame, PY_MONITORING_EVENT_RERAISE)) {
|
||||
return;
|
||||
}
|
||||
do_monitor_exc(tstate, frame, instr, PY_MONITORING_EVENT_RERAISE);
|
||||
}
|
||||
|
||||
static int
|
||||
monitor_stop_iteration(PyThreadState *tstate, _PyInterpreterFrame *frame,
|
||||
_Py_CODEUNIT *instr)
|
||||
|
|
9
Python/generated_cases.c.h
generated
9
Python/generated_cases.c.h
generated
|
@ -881,7 +881,11 @@
|
|||
exc = args[0];
|
||||
/* fall through */
|
||||
case 0:
|
||||
if (do_raise(tstate, exc, cause)) { STACK_SHRINK(oparg); goto exception_unwind; }
|
||||
if (do_raise(tstate, exc, cause)) {
|
||||
assert(oparg == 0);
|
||||
monitor_reraise(tstate, frame, next_instr-1);
|
||||
goto exception_unwind;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
_PyErr_SetString(tstate, PyExc_SystemError,
|
||||
|
@ -1237,6 +1241,7 @@
|
|||
assert(exc && PyExceptionInstance_Check(exc));
|
||||
Py_INCREF(exc);
|
||||
_PyErr_SetRaisedException(tstate, exc);
|
||||
monitor_reraise(tstate, frame, next_instr-1);
|
||||
goto exception_unwind;
|
||||
}
|
||||
|
||||
|
@ -1251,6 +1256,7 @@
|
|||
else {
|
||||
Py_INCREF(exc);
|
||||
_PyErr_SetRaisedException(tstate, exc);
|
||||
monitor_reraise(tstate, frame, next_instr-1);
|
||||
goto exception_unwind;
|
||||
}
|
||||
STACK_SHRINK(2);
|
||||
|
@ -1274,6 +1280,7 @@
|
|||
}
|
||||
else {
|
||||
_PyErr_SetRaisedException(tstate, Py_NewRef(exc_value));
|
||||
monitor_reraise(tstate, frame, next_instr-1);
|
||||
goto exception_unwind;
|
||||
}
|
||||
STACK_SHRINK(1);
|
||||
|
|
|
@ -2030,6 +2030,7 @@ static const char *const event_names [] = {
|
|||
[PY_MONITORING_EVENT_C_RETURN] = "C_RETURN",
|
||||
[PY_MONITORING_EVENT_PY_THROW] = "PY_THROW",
|
||||
[PY_MONITORING_EVENT_RAISE] = "RAISE",
|
||||
[PY_MONITORING_EVENT_RERAISE] = "RERAISE",
|
||||
[PY_MONITORING_EVENT_EXCEPTION_HANDLED] = "EXCEPTION_HANDLED",
|
||||
[PY_MONITORING_EVENT_C_RAISE] = "C_RAISE",
|
||||
[PY_MONITORING_EVENT_PY_UNWIND] = "PY_UNWIND",
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue