[Python-checkins] bpo-46417: Fix _PyStaticType_Dealloc() (GH-30810)

vstinner webhook-mailer at python.org
Sat Jan 22 18:32:16 EST 2022


https://github.com/python/cpython/commit/a1444f43584af0f7a0af72aa06ba0a86ae5a87a2
commit: a1444f43584af0f7a0af72aa06ba0a86ae5a87a2
branch: main
author: Victor Stinner <vstinner at python.org>
committer: vstinner <vstinner at python.org>
date: 2022年01月23日T00:32:05+01:00
summary:
bpo-46417: Fix _PyStaticType_Dealloc() (GH-30810)
_PyStaticType_Dealloc() now only calls PyObject_ClearWeakRefs()
if the call is not going to fail.
files:
M Objects/typeobject.c
diff --git a/Objects/typeobject.c b/Objects/typeobject.c
index cc4612f9308d0..452759334f456 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);


More information about the Python-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /