[Python-checkins] cpython: Issue #29358: Add postcondition checks on types
victor.stinner
python-checkins at python.org
Wed Jan 25 21:18:03 EST 2017
https://hg.python.org/cpython/rev/8feb6a5ce4c6
changeset: 106317:8feb6a5ce4c6
user: Victor Stinner <victor.stinner at gmail.com>
date: Wed Jan 25 23:33:27 2017 +0100
summary:
Issue #29358: Add postcondition checks on types
files:
Objects/typeobject.c | 27 ++++++++++++++++++++++++---
1 files changed, 24 insertions(+), 3 deletions(-)
diff --git a/Objects/typeobject.c b/Objects/typeobject.c
--- a/Objects/typeobject.c
+++ b/Objects/typeobject.c
@@ -121,6 +121,22 @@
return NULL;
}
+#ifdef Py_DEBUG
+static int
+_PyType_CheckConsistency(PyTypeObject *type)
+{
+ if (!(type->tp_flags & Py_TPFLAGS_READY)) {
+ /* don't check types before PyType_Ready() */
+ return 1;
+ }
+
+ assert(!(type->tp_flags & Py_TPFLAGS_READYING));
+ assert(type->tp_mro != NULL && PyTuple_Check(type->tp_mro));
+ assert(type->tp_dict != NULL);
+ return 1;
+}
+#endif
+
static const char *
_PyType_DocWithoutSignature(const char *name, const char *internal_doc)
{
@@ -719,6 +735,7 @@
Py_DECREF(old_bases);
Py_DECREF(old_base);
+ assert(_PyType_CheckConsistency(type));
return res;
undo:
@@ -752,6 +769,7 @@
Py_DECREF(old_base);
}
+ assert(_PyType_CheckConsistency(type));
return -1;
}
@@ -3034,6 +3052,7 @@
static int
type_setattro(PyTypeObject *type, PyObject *name, PyObject *value)
{
+ int res;
if (!(type->tp_flags & Py_TPFLAGS_HEAPTYPE)) {
PyErr_Format(
PyExc_TypeError,
@@ -3043,7 +3062,9 @@
}
if (_PyObject_GenericSetAttrWithDict((PyObject *)type, name, value, NULL) < 0)
return -1;
- return update_slot(type, name);
+ res = update_slot(type, name);
+ assert(_PyType_CheckConsistency(type));
+ return res;
}
extern void
@@ -4851,7 +4872,7 @@
Py_ssize_t i, n;
if (type->tp_flags & Py_TPFLAGS_READY) {
- assert(type->tp_dict != NULL);
+ assert(_PyType_CheckConsistency(type));
return 0;
}
assert((type->tp_flags & Py_TPFLAGS_READYING) == 0);
@@ -5045,9 +5066,9 @@
}
/* All done -- set the ready flag */
- assert(type->tp_dict != NULL);
type->tp_flags =
(type->tp_flags & ~Py_TPFLAGS_READYING) | Py_TPFLAGS_READY;
+ assert(_PyType_CheckConsistency(type));
return 0;
error:
--
Repository URL: https://hg.python.org/cpython
More information about the Python-checkins
mailing list