diff options
author | Benjamin Peterson <benjamin@python.org> | 2011-08-17 16:54:03 (GMT) |
---|---|---|
committer | Benjamin Peterson <benjamin@python.org> | 2011-08-17 16:54:03 (GMT) |
commit | d9f23d200426983bfb2aadf254fb84d2447a70e8 (patch) | |
tree | 7d236c66c89cc77f3b99dcd66d6a8ae18a0372a4 | |
parent | af3dcd2f9871a953d58408b114b8d1579618c6e8 (diff) | |
download | cpython-d9f23d200426983bfb2aadf254fb84d2447a70e8.zip cpython-d9f23d200426983bfb2aadf254fb84d2447a70e8.tar.gz cpython-d9f23d200426983bfb2aadf254fb84d2447a70e8.tar.bz2 |
factor out common checks for setting special type attributes
-rw-r--r-- | Objects/typeobject.c | 46 |
1 files changed, 19 insertions, 27 deletions
diff --git a/Objects/typeobject.c b/Objects/typeobject.c index 669b709..33becb3 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -201,6 +201,22 @@ static PyMemberDef type_members[] = { {0} }; +static int +check_set_special_type_attr(PyTypeObject *type, PyObject *value, const char *name) +{ + if (!(type->tp_flags & Py_TPFLAGS_HEAPTYPE)) { + PyErr_Format(PyExc_TypeError, + "can't set %s.%s", type->tp_name, name); + return 0; + } + if (!value) { + PyErr_Format(PyExc_TypeError, + "can't delete %s.%s", type->tp_name, name); + return 0; + } + return 1; +} + static PyObject * type_name(PyTypeObject *type, void *context) { @@ -229,16 +245,8 @@ type_set_name(PyTypeObject *type, PyObject *value, void *context) char *tp_name; PyObject *tmp; - if (!(type->tp_flags & Py_TPFLAGS_HEAPTYPE)) { - PyErr_Format(PyExc_TypeError, - "can't set %s.__name__", type->tp_name); - return -1; - } - if (!value) { - PyErr_Format(PyExc_TypeError, - "can't delete %s.__name__", type->tp_name); + if (!check_set_special_type_attr(type, value, "__name__")) return -1; - } if (!PyUnicode_Check(value)) { PyErr_Format(PyExc_TypeError, "can only assign string to %s.__name__, not '%s'", @@ -301,16 +309,8 @@ type_module(PyTypeObject *type, void *context) static int type_set_module(PyTypeObject *type, PyObject *value, void *context) { - if (!(type->tp_flags & Py_TPFLAGS_HEAPTYPE)) { - PyErr_Format(PyExc_TypeError, - "can't set %s.__module__", type->tp_name); - return -1; - } - if (!value) { - PyErr_Format(PyExc_TypeError, - "can't delete %s.__module__", type->tp_name); + if (!check_set_special_type_attr(type, value, "__module__")) return -1; - } PyType_Modified(type); @@ -433,16 +433,8 @@ type_set_bases(PyTypeObject *type, PyObject *value, void *context) PyTypeObject *new_base, *old_base; PyObject *old_bases, *old_mro; - if (!(type->tp_flags & Py_TPFLAGS_HEAPTYPE)) { - PyErr_Format(PyExc_TypeError, - "can't set %s.__bases__", type->tp_name); - return -1; - } - if (!value) { - PyErr_Format(PyExc_TypeError, - "can't delete %s.__bases__", type->tp_name); + if (!check_set_special_type_attr(type, value, "__bases__")) return -1; - } if (!PyTuple_Check(value)) { PyErr_Format(PyExc_TypeError, "can only assign tuple to %s.__bases__, not %s", |