summaryrefslogtreecommitdiffstats
path: root/Objects/exceptions.c
diff options
context:
space:
mode:
authorVictor Stinner <vstinner@python.org>2022-01-22 21:31:44 (GMT)
committerGitHub <noreply@github.com>2022-01-22 21:31:44 (GMT)
commit621a45ccacd121f9ae4d8a539f040410c74b253b (patch)
treeaeac5229bd9dc2590aeca4f74c0f91bd86c46f22 /Objects/exceptions.c
parentf1bcdeaca6e912a2bec1fbcff76cc49e7f761d38 (diff)
downloadcpython-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.c27
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