From: Victor Stinner Date: Sat, 22 Jan 2022 23:32:05 +0000 (+0100) Subject: bpo-46417: Fix _PyStaticType_Dealloc() (GH-30810) X-Git-Tag: v3.11.0a5~141 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=a1444f43584af0f7a0af72aa06ba0a86ae5a87a2;p=thirdparty%2FPython%2Fcpython.git bpo-46417: Fix _PyStaticType_Dealloc() (GH-30810) _PyStaticType_Dealloc() now only calls PyObject_ClearWeakRefs() if the call is not going to fail. --- diff --git a/Objects/typeobject.c b/Objects/typeobject.c index cc4612f9308d..452759334f45 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -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);