PyAPI_FUNC(void) PyEval_SetTrace(Py_tracefunc, PyObject *);
PyAPI_FUNC(int) _PyEval_SetTrace(PyThreadState *tstate, Py_tracefunc func, PyObject *arg);
PyAPI_FUNC(int) _PyEval_GetCoroutineOriginTrackingDepth(void);
-PyAPI_FUNC(void) _PyEval_SetAsyncGenFirstiter(PyObject *);
+PyAPI_FUNC(int) _PyEval_SetAsyncGenFirstiter(PyObject *);
PyAPI_FUNC(PyObject *) _PyEval_GetAsyncGenFirstiter(void);
-PyAPI_FUNC(void) _PyEval_SetAsyncGenFinalizer(PyObject *);
+PyAPI_FUNC(int) _PyEval_SetAsyncGenFinalizer(PyObject *);
PyAPI_FUNC(PyObject *) _PyEval_GetAsyncGenFinalizer(void);
/* Helper to look up a builtin object */
--- /dev/null
+Properly handle :func:`sys.audit` failures in
+:func:`sys.set_asyncgen_hooks`.
return tstate->coroutine_origin_tracking_depth;
}
-void
+int
_PyEval_SetAsyncGenFirstiter(PyObject *firstiter)
{
PyThreadState *tstate = _PyThreadState_GET();
if (PySys_Audit("sys.set_asyncgen_hook_firstiter", NULL) < 0) {
- return;
+ return -1;
}
Py_XINCREF(firstiter);
Py_XSETREF(tstate->async_gen_firstiter, firstiter);
+ return 0;
}
PyObject *
return tstate->async_gen_firstiter;
}
-void
+int
_PyEval_SetAsyncGenFinalizer(PyObject *finalizer)
{
PyThreadState *tstate = _PyThreadState_GET();
if (PySys_Audit("sys.set_asyncgen_hook_finalizer", NULL) < 0) {
- return;
+ return -1;
}
Py_XINCREF(finalizer);
Py_XSETREF(tstate->async_gen_finalizer, finalizer);
+ return 0;
}
PyObject *
Py_TYPE(finalizer)->tp_name);
return NULL;
}
- _PyEval_SetAsyncGenFinalizer(finalizer);
+ if (_PyEval_SetAsyncGenFinalizer(finalizer) < 0) {
+ return NULL;
+ }
}
- else if (finalizer == Py_None) {
- _PyEval_SetAsyncGenFinalizer(NULL);
+ else if (finalizer == Py_None && _PyEval_SetAsyncGenFinalizer(NULL) < 0) {
+ return NULL;
}
if (firstiter && firstiter != Py_None) {
Py_TYPE(firstiter)->tp_name);
return NULL;
}
- _PyEval_SetAsyncGenFirstiter(firstiter);
+ if (_PyEval_SetAsyncGenFirstiter(firstiter) < 0) {
+ return NULL;
+ }
}
- else if (firstiter == Py_None) {
- _PyEval_SetAsyncGenFirstiter(NULL);
+ else if (firstiter == Py_None && _PyEval_SetAsyncGenFirstiter(NULL) < 0) {
+ return NULL;
}
Py_RETURN_NONE;