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:
Victor Stinner 2018-10-26 18:39:11 +02:00 committed by GitHub
parent a4b2bc70f6
commit 0862505a03
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 13 additions and 10 deletions

View File

@ -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;