@@ -4071,8 +4071,6 @@ type_dealloc_common(PyTypeObject *type)
4071
4071
remove_all_subclasses (type , type -> tp_bases );
4072
4072
PyErr_Restore (tp , val , tb );
4073
4073
}
4074
-
4075
- PyObject_ClearWeakRefs ((PyObject * )type );
4076
4074
}
4077
4075
4078
4076
@@ -4094,19 +4092,29 @@ _PyStaticType_Dealloc(PyTypeObject *type)
4094
4092
Py_CLEAR (type -> tp_cache );
4095
4093
// type->tp_subclasses is NULL
4096
4094
4095
+ // PyObject_ClearWeakRefs() raises an exception if Py_REFCNT() != 0
4096
+ if (Py_REFCNT (type ) == 0 ) {
4097
+ PyObject_ClearWeakRefs ((PyObject * )type );
4098
+ }
4099
+
4097
4100
type -> tp_flags &= ~Py_TPFLAGS_READY ;
4098
4101
}
4099
4102
4100
4103
4101
4104
static void
4102
4105
type_dealloc (PyTypeObject * type )
4103
4106
{
4104
- /* Assert this is a heap-allocated type object */
4107
+ // Assert this is a heap-allocated type object
4105
4108
_PyObject_ASSERT ((PyObject * )type , type -> tp_flags & Py_TPFLAGS_HEAPTYPE );
4109
+
4106
4110
_PyObject_GC_UNTRACK (type );
4107
4111
4108
4112
type_dealloc_common (type );
4109
4113
4114
+ // PyObject_ClearWeakRefs() raises an exception if Py_REFCNT() != 0
4115
+ assert (Py_REFCNT (type ) == 0 );
4116
+ PyObject_ClearWeakRefs ((PyObject * )type );
4117
+
4110
4118
Py_XDECREF (type -> tp_base );
4111
4119
Py_XDECREF (type -> tp_dict );
4112
4120
Py_XDECREF (type -> tp_bases );
0 commit comments