diff options
author | Victor Stinner <vstinner@python.org> | 2022-01-22 21:31:44 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-01-22 21:31:44 (GMT) |
commit | 621a45ccacd121f9ae4d8a539f040410c74b253b (patch) | |
tree | aeac5229bd9dc2590aeca4f74c0f91bd86c46f22 /Objects/exceptions.c | |
parent | f1bcdeaca6e912a2bec1fbcff76cc49e7f761d38 (diff) | |
download | cpython-621a45ccacd121f9ae4d8a539f040410c74b253b.zip cpython-621a45ccacd121f9ae4d8a539f040410c74b253b.tar.gz cpython-621a45ccacd121f9ae4d8a539f040410c74b253b.tar.bz2 |
bpo-46417: Py_Finalize() clears static exceptioins (GH-30805)
The Py_Finalize() function now clears exceptions implemented as
static types.
Add _PyExc_FiniTypes() function, called by _PyExc_Fini().
Diffstat (limited to 'Objects/exceptions.c')
-rw-r--r-- | Objects/exceptions.c | 27 |
1 files changed, 26 insertions, 1 deletions
diff --git a/Objects/exceptions.c b/Objects/exceptions.c index f8f727c..6bf70e2 100644 --- a/Objects/exceptions.c +++ b/Objects/exceptions.c @@ -3536,13 +3536,36 @@ _PyExc_InitTypes(PyInterpreterState *interp) } +static void +_PyExc_FiniTypes(PyInterpreterState *interp) +{ + if (!_Py_IsMainInterpreter(interp)) { + return; + } + + for (Py_ssize_t i=Py_ARRAY_LENGTH(static_exceptions) - 1; i >= 0; i--) { + PyTypeObject *exc = static_exceptions[i].exc; + + // Cannot delete a type if it still has subclasses + if (exc->tp_subclasses != NULL) { + continue; + } + + _PyStaticType_Dealloc(exc); + } +} + + PyStatus _PyExc_InitGlobalObjects(PyInterpreterState *interp) { + if (!_Py_IsMainInterpreter(interp)) { + return _PyStatus_OK(); + } + if (preallocate_memerrors() < 0) { return _PyStatus_NO_MEMORY(); } - return _PyStatus_OK(); } @@ -3656,6 +3679,8 @@ _PyExc_Fini(PyInterpreterState *interp) struct _Py_exc_state *state = &interp->exc_state; free_preallocated_memerrors(state); Py_CLEAR(state->errnomap); + + _PyExc_FiniTypes(interp); } /* Helper to do the equivalent of "raise X from Y" in C, but always using |