[Python-checkins] bpo-9263: Use _PyObject_ASSERT() in typeobject.c (GH-10111)

Victor Stinner webhook-mailer at python.org
Fri Oct 26 12:39:23 EDT 2018


https://github.com/python/cpython/commit/0862505a0377c12e8004b2eb8de0555f26ce9530
commit: 0862505a0377c12e8004b2eb8de0555f26ce9530
branch: master
author: Victor Stinner <vstinner at redhat.com>
committer: GitHub <noreply at github.com>
date: 2018年10月26日T18:39:11+02:00
summary:
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.
files:
M Objects/typeobject.c
diff --git a/Objects/typeobject.c b/Objects/typeobject.c
index b9e69bf1bd1d..3b70e6952e0f 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;
 


More information about the Python-checkins mailing list

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