mirror of
https://github.com/python/cpython.git
synced 2025-07-08 03:45:36 +00:00
gh-76785: Minor Cleanup of Exception-related Cross-interpreter State (gh-126602)
This change makes it easier to backport the _interpreters, _interpqueues, and _interpchannels modules to Python 3.12.
This commit is contained in:
parent
3c6d2d1230
commit
b697d8c48e
4 changed files with 83 additions and 60 deletions
|
@ -25,71 +25,78 @@ static PyTypeObject _PyExc_InterpreterNotFoundError = {
|
|||
};
|
||||
PyObject *PyExc_InterpreterNotFoundError = (PyObject *)&_PyExc_InterpreterNotFoundError;
|
||||
|
||||
/* NotShareableError extends ValueError */
|
||||
|
||||
static int
|
||||
_init_not_shareable_error_type(PyInterpreterState *interp)
|
||||
{
|
||||
const char *name = "interpreters.NotShareableError";
|
||||
PyObject *base = PyExc_ValueError;
|
||||
PyObject *ns = NULL;
|
||||
PyObject *exctype = PyErr_NewException(name, base, ns);
|
||||
if (exctype == NULL) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
_PyInterpreterState_GetXIState(interp)->PyExc_NotShareableError = exctype;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
_fini_not_shareable_error_type(PyInterpreterState *interp)
|
||||
{
|
||||
Py_CLEAR(_PyInterpreterState_GetXIState(interp)->PyExc_NotShareableError);
|
||||
}
|
||||
|
||||
static PyObject *
|
||||
_get_not_shareable_error_type(PyInterpreterState *interp)
|
||||
{
|
||||
assert(_PyInterpreterState_GetXIState(interp)->PyExc_NotShareableError != NULL);
|
||||
return _PyInterpreterState_GetXIState(interp)->PyExc_NotShareableError;
|
||||
}
|
||||
|
||||
|
||||
/* lifecycle */
|
||||
|
||||
static int
|
||||
init_exceptions(PyInterpreterState *interp)
|
||||
init_static_exctypes(exceptions_t *state, PyInterpreterState *interp)
|
||||
{
|
||||
assert(state == &_PyXI_GET_STATE(interp)->exceptions);
|
||||
PyTypeObject *base = (PyTypeObject *)PyExc_Exception;
|
||||
|
||||
// builtin static types
|
||||
|
||||
// PyExc_InterpreterError
|
||||
_PyExc_InterpreterError.tp_base = base;
|
||||
_PyExc_InterpreterError.tp_traverse = base->tp_traverse;
|
||||
_PyExc_InterpreterError.tp_clear = base->tp_clear;
|
||||
if (_PyStaticType_InitBuiltin(interp, &_PyExc_InterpreterError) < 0) {
|
||||
return -1;
|
||||
goto error;
|
||||
}
|
||||
state->PyExc_InterpreterError = (PyObject *)&_PyExc_InterpreterError;
|
||||
|
||||
// PyExc_InterpreterNotFoundError
|
||||
_PyExc_InterpreterNotFoundError.tp_traverse = base->tp_traverse;
|
||||
_PyExc_InterpreterNotFoundError.tp_clear = base->tp_clear;
|
||||
if (_PyStaticType_InitBuiltin(interp, &_PyExc_InterpreterNotFoundError) < 0) {
|
||||
return -1;
|
||||
goto error;
|
||||
}
|
||||
|
||||
// heap types
|
||||
|
||||
// We would call _init_not_shareable_error_type() here too,
|
||||
// but that leads to ref leaks
|
||||
state->PyExc_InterpreterNotFoundError =
|
||||
(PyObject *)&_PyExc_InterpreterNotFoundError;
|
||||
|
||||
return 0;
|
||||
|
||||
error:
|
||||
fini_static_exctypes(state, interp);
|
||||
return -1;
|
||||
}
|
||||
|
||||
static void
|
||||
fini_exceptions(PyInterpreterState *interp)
|
||||
fini_static_exctypes(exceptions_t *state, PyInterpreterState *interp)
|
||||
{
|
||||
// Likewise with _fini_not_shareable_error_type().
|
||||
_PyStaticType_FiniBuiltin(interp, &_PyExc_InterpreterNotFoundError);
|
||||
_PyStaticType_FiniBuiltin(interp, &_PyExc_InterpreterError);
|
||||
assert(state == &_PyXI_GET_STATE(interp)->exceptions);
|
||||
if (state->PyExc_InterpreterNotFoundError != NULL) {
|
||||
state->PyExc_InterpreterNotFoundError = NULL;
|
||||
_PyStaticType_FiniBuiltin(interp, &_PyExc_InterpreterNotFoundError);
|
||||
}
|
||||
if (state->PyExc_InterpreterError != NULL) {
|
||||
state->PyExc_InterpreterError = NULL;
|
||||
_PyStaticType_FiniBuiltin(interp, &_PyExc_InterpreterError);
|
||||
}
|
||||
}
|
||||
|
||||
static int
|
||||
init_heap_exctypes(exceptions_t *state)
|
||||
{
|
||||
PyObject *exctype;
|
||||
|
||||
/* NotShareableError extends ValueError */
|
||||
const char *name = "interpreters.NotShareableError";
|
||||
PyObject *base = PyExc_ValueError;
|
||||
PyObject *ns = NULL;
|
||||
exctype = PyErr_NewException(name, base, ns);
|
||||
if (exctype == NULL) {
|
||||
goto error;
|
||||
}
|
||||
state->PyExc_NotShareableError = exctype;
|
||||
|
||||
return 0;
|
||||
|
||||
error:
|
||||
fini_heap_exctypes(state);
|
||||
return -1;
|
||||
}
|
||||
|
||||
static void
|
||||
fini_heap_exctypes(exceptions_t *state)
|
||||
{
|
||||
Py_CLEAR(state->PyExc_NotShareableError);
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue