diff options
| author | Victor Stinner <vstinner@redhat.com> | 2018-10-26 18:39:11 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2018-10-26 18:39:11 +0200 |
| commit | 0862505a0377c12e8004b2eb8de0555f26ce9530 (patch) | |
| tree | 6067f9e004771253c81627d83cd4def753cc39a8 | |
| parent | a4b2bc70f69d93d8252861b455052c051b7167ae (diff) | |
| download | cpython-git-0862505a0377c12e8004b2eb8de0555f26ce9530.tar.gz | |
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.
| -rw-r--r-- | Objects/typeobject.c | 23 |
1 files changed, 13 insertions, 10 deletions
diff --git a/Objects/typeobject.c b/Objects/typeobject.c index b9e69bf1bd..3b70e6952e 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -1116,7 +1116,7 @@ subtype_dealloc(PyObject *self) /* Extract the type; we expect it to be a heap type */ 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 */ @@ -2208,17 +2208,19 @@ subtype_getweakref(PyObject *obj, void *context) { PyObject **weaklistptr; PyObject *result; + PyTypeObject *type = Py_TYPE(obj); - if (Py_TYPE(obj)->tp_weaklistoffset == 0) { + if (type->tp_weaklistoffset == 0) { PyErr_SetString(PyExc_AttributeError, "This object has no __weakref__"); return NULL; } - assert(Py_TYPE(obj)->tp_weaklistoffset > 0); - assert(Py_TYPE(obj)->tp_weaklistoffset + sizeof(PyObject *) <= - (size_t)(Py_TYPE(obj)->tp_basicsize)); - weaklistptr = (PyObject **) - ((char *)obj + Py_TYPE(obj)->tp_weaklistoffset); + _PyObject_ASSERT((PyObject *)type, + type->tp_weaklistoffset > 0); + _PyObject_ASSERT((PyObject *)type, + ((type->tp_weaklistoffset + sizeof(PyObject *)) + <= (size_t)(type->tp_basicsize))); + weaklistptr = (PyObject **)((char *)obj + type->tp_weaklistoffset); if (*weaklistptr == NULL) result = Py_None; else @@ -3279,7 +3281,7 @@ type_dealloc(PyTypeObject *type) PyObject *tp, *val, *tb; /* 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); PyErr_Fetch(&tp, &val, &tb); remove_all_subclasses(type, type->tp_bases); @@ -3503,7 +3505,7 @@ type_clear(PyTypeObject *type) PyDictKeysObject *cached_keys; /* Because of type_is_gc(), the collector only calls this 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 the dict, so that other objects caught in a reference cycle @@ -5117,7 +5119,8 @@ PyType_Ready(PyTypeObject *type) assert(_PyType_CheckConsistency(type)); 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; |
