mirror of https://github.com/python/cpython
bpo-9263: Use _PyObject_ASSERT() in typeobject.c (GH-10111)
Replace assert() with _PyObject_ASSERT() in Objects/typeobject.c to dump the faulty object on assertion failure to ease debugging.
This commit is contained in:
parent
a4b2bc70f6
commit
0862505a03
|
@ -1116,7 +1116,7 @@ subtype_dealloc(PyObject *self)
|
||||||
|
|
||||||
/* Extract the type; we expect it to be a heap type */
|
/* Extract the type; we expect it to be a heap type */
|
||||||
type = Py_TYPE(self);
|
type = Py_TYPE(self);
|
||||||
assert(type->tp_flags & Py_TPFLAGS_HEAPTYPE);
|
_PyObject_ASSERT((PyObject *)type, type->tp_flags & Py_TPFLAGS_HEAPTYPE);
|
||||||
|
|
||||||
/* Test whether the type has GC exactly once */
|
/* Test whether the type has GC exactly once */
|
||||||
|
|
||||||
|
@ -2208,17 +2208,19 @@ subtype_getweakref(PyObject *obj, void *context)
|
||||||
{
|
{
|
||||||
PyObject **weaklistptr;
|
PyObject **weaklistptr;
|
||||||
PyObject *result;
|
PyObject *result;
|
||||||
|
PyTypeObject *type = Py_TYPE(obj);
|
||||||
|
|
||||||
if (Py_TYPE(obj)->tp_weaklistoffset == 0) {
|
if (type->tp_weaklistoffset == 0) {
|
||||||
PyErr_SetString(PyExc_AttributeError,
|
PyErr_SetString(PyExc_AttributeError,
|
||||||
"This object has no __weakref__");
|
"This object has no __weakref__");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
assert(Py_TYPE(obj)->tp_weaklistoffset > 0);
|
_PyObject_ASSERT((PyObject *)type,
|
||||||
assert(Py_TYPE(obj)->tp_weaklistoffset + sizeof(PyObject *) <=
|
type->tp_weaklistoffset > 0);
|
||||||
(size_t)(Py_TYPE(obj)->tp_basicsize));
|
_PyObject_ASSERT((PyObject *)type,
|
||||||
weaklistptr = (PyObject **)
|
((type->tp_weaklistoffset + sizeof(PyObject *))
|
||||||
((char *)obj + Py_TYPE(obj)->tp_weaklistoffset);
|
<= (size_t)(type->tp_basicsize)));
|
||||||
|
weaklistptr = (PyObject **)((char *)obj + type->tp_weaklistoffset);
|
||||||
if (*weaklistptr == NULL)
|
if (*weaklistptr == NULL)
|
||||||
result = Py_None;
|
result = Py_None;
|
||||||
else
|
else
|
||||||
|
@ -3279,7 +3281,7 @@ type_dealloc(PyTypeObject *type)
|
||||||
PyObject *tp, *val, *tb;
|
PyObject *tp, *val, *tb;
|
||||||
|
|
||||||
/* Assert this is a heap-allocated type object */
|
/* Assert this is a heap-allocated type object */
|
||||||
assert(type->tp_flags & Py_TPFLAGS_HEAPTYPE);
|
_PyObject_ASSERT((PyObject *)type, type->tp_flags & Py_TPFLAGS_HEAPTYPE);
|
||||||
_PyObject_GC_UNTRACK(type);
|
_PyObject_GC_UNTRACK(type);
|
||||||
PyErr_Fetch(&tp, &val, &tb);
|
PyErr_Fetch(&tp, &val, &tb);
|
||||||
remove_all_subclasses(type, type->tp_bases);
|
remove_all_subclasses(type, type->tp_bases);
|
||||||
|
@ -3503,7 +3505,7 @@ type_clear(PyTypeObject *type)
|
||||||
PyDictKeysObject *cached_keys;
|
PyDictKeysObject *cached_keys;
|
||||||
/* Because of type_is_gc(), the collector only calls this
|
/* Because of type_is_gc(), the collector only calls this
|
||||||
for heaptypes. */
|
for heaptypes. */
|
||||||
assert(type->tp_flags & Py_TPFLAGS_HEAPTYPE);
|
_PyObject_ASSERT((PyObject *)type, type->tp_flags & Py_TPFLAGS_HEAPTYPE);
|
||||||
|
|
||||||
/* We need to invalidate the method cache carefully before clearing
|
/* We need to invalidate the method cache carefully before clearing
|
||||||
the dict, so that other objects caught in a reference cycle
|
the dict, so that other objects caught in a reference cycle
|
||||||
|
@ -5117,7 +5119,8 @@ PyType_Ready(PyTypeObject *type)
|
||||||
assert(_PyType_CheckConsistency(type));
|
assert(_PyType_CheckConsistency(type));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
assert((type->tp_flags & Py_TPFLAGS_READYING) == 0);
|
_PyObject_ASSERT((PyObject *)type,
|
||||||
|
(type->tp_flags & Py_TPFLAGS_READYING) == 0);
|
||||||
|
|
||||||
type->tp_flags |= Py_TPFLAGS_READYING;
|
type->tp_flags |= Py_TPFLAGS_READYING;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue