summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBenjamin Peterson <benjamin@python.org>2011-08-17 16:54:03 (GMT)
committerBenjamin Peterson <benjamin@python.org>2011-08-17 16:54:03 (GMT)
commitd9f23d200426983bfb2aadf254fb84d2447a70e8 (patch)
tree7d236c66c89cc77f3b99dcd66d6a8ae18a0372a4
parentaf3dcd2f9871a953d58408b114b8d1579618c6e8 (diff)
downloadcpython-d9f23d200426983bfb2aadf254fb84d2447a70e8.zip
cpython-d9f23d200426983bfb2aadf254fb84d2447a70e8.tar.gz
cpython-d9f23d200426983bfb2aadf254fb84d2447a70e8.tar.bz2
factor out common checks for setting special type attributes
-rw-r--r--Objects/typeobject.c46
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",