gh-118692: Avoid creating unnecessary StopIteration instances for monitoring (#119216)

This commit is contained in:
Irit Katriel
2024-05-21 16:42:51 -04:00
committed by GitHub
parent b64182550f
commit 6e9863d7a3
10 changed files with 60 additions and 35 deletions

View File

@@ -2622,7 +2622,7 @@ exception_event_teardown(int err, PyObject *exc) {
}
else {
assert(PyErr_Occurred());
Py_DECREF(exc);
Py_XDECREF(exc);
}
return err;
}
@@ -2712,15 +2712,17 @@ _PyMonitoring_FirePyUnwindEvent(PyMonitoringState *state, PyObject *codelike, in
}
int
_PyMonitoring_FireStopIterationEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset)
_PyMonitoring_FireStopIterationEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset, PyObject *value)
{
int event = PY_MONITORING_EVENT_STOP_ITERATION;
assert(state->active);
assert(!PyErr_Occurred());
PyErr_SetObject(PyExc_StopIteration, value);
PyObject *exc;
if (exception_event_setup(&exc, event) < 0) {
return -1;
}
PyObject *args[4] = { NULL, NULL, NULL, exc };
int err = capi_call_instrumentation(state, codelike, offset, args, 3, event);
return exception_event_teardown(err, exc);
return exception_event_teardown(err, NULL);
}