From a1444f43584af0f7a0af72aa06ba0a86ae5a87a2 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Sun, 23 Jan 2022 00:32:05 +0100 Subject: bpo-46417: Fix _PyStaticType_Dealloc() (GH-30810) _PyStaticType_Dealloc() now only calls PyObject_ClearWeakRefs() if the call is not going to fail. --- Objects/typeobject.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/Objects/typeobject.c b/Objects/typeobject.c index cc4612f..4527593 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); -- cgit v0.12