]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-46417: Fix _PyStaticType_Dealloc() (GH-30810)
authorVictor Stinner <vstinner@python.org>
Sat, 22 Jan 2022 23:32:05 +0000 (00:32 +0100)
committerGitHub <noreply@github.com>
Sat, 22 Jan 2022 23:32:05 +0000 (00:32 +0100)
_PyStaticType_Dealloc() now only calls PyObject_ClearWeakRefs()
if the call is not going to fail.

Objects/typeobject.c

index cc4612f9308d019596a3b5b665c972ac92eb75ac..452759334f456d36d4814cf42129a5b614001d65 100644 (file)
@@ -4071,8 +4071,6 @@ type_dealloc_common(PyTypeObject *type)
         remove_all_subclasses(type, type->tp_bases);
         PyErr_Restore(tp, val, tb);
     }
-
-    PyObject_ClearWeakRefs((PyObject *)type);
 }
 
 
@@ -4094,6 +4092,11 @@ _PyStaticType_Dealloc(PyTypeObject *type)
     Py_CLEAR(type->tp_cache);
     // type->tp_subclasses is NULL
 
+    // PyObject_ClearWeakRefs() raises an exception if Py_REFCNT() != 0
+    if (Py_REFCNT(type) == 0) {
+        PyObject_ClearWeakRefs((PyObject *)type);
+    }
+
     type->tp_flags &= ~Py_TPFLAGS_READY;
 }
 
@@ -4101,12 +4104,17 @@ _PyStaticType_Dealloc(PyTypeObject *type)
 static void
 type_dealloc(PyTypeObject *type)
 {
-    /* Assert this is a heap-allocated type object */
+    // Assert this is a heap-allocated type object
     _PyObject_ASSERT((PyObject *)type, type->tp_flags & Py_TPFLAGS_HEAPTYPE);
+
     _PyObject_GC_UNTRACK(type);
 
     type_dealloc_common(type);
 
+    // PyObject_ClearWeakRefs() raises an exception if Py_REFCNT() != 0
+    assert(Py_REFCNT(type) == 0);
+    PyObject_ClearWeakRefs((PyObject *)type);
+
     Py_XDECREF(type->tp_base);
     Py_XDECREF(type->tp_dict);
     Py_XDECREF(type->tp_bases);