bpo-46417: Fix _PyStaticType_Dealloc() (GH-30810)

_PyStaticType_Dealloc() now only calls PyObject_ClearWeakRefs()
if the call is not going to fail.
This commit is contained in:
Victor Stinner 2022-01-23 00:32:05 +01:00 committed by GitHub
parent 12f4ac3bc8
commit a1444f4358
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 11 additions and 3 deletions

View 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);