]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-46417: Py_Finalize() clears static exceptioins (GH-30805)
authorVictor Stinner <vstinner@python.org>
Sat, 22 Jan 2022 21:31:44 +0000 (22:31 +0100)
committerGitHub <noreply@github.com>
Sat, 22 Jan 2022 21:31:44 +0000 (22:31 +0100)
The Py_Finalize() function now clears exceptions implemented as
static types.

Add _PyExc_FiniTypes() function, called by _PyExc_Fini().

Objects/exceptions.c

index f8f727c673c023cd28e34f55d42be1fa88e62ee1..6bf70e2b15c16d352c063d56104aa05dcd0da10f 100644 (file)
@@ -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