factor out common checks for setting special type attributes

This commit is contained in:
Benjamin Peterson 2011-08-17 11:54:03 -05:00
parent af3dcd2f98
commit d9f23d2004
1 changed files with 19 additions and 27 deletions

View File

@ -201,6 +201,22 @@ static PyMemberDef type_members[] = {
{0} {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 * static PyObject *
type_name(PyTypeObject *type, void *context) type_name(PyTypeObject *type, void *context)
{ {
@ -229,16 +245,8 @@ type_set_name(PyTypeObject *type, PyObject *value, void *context)
char *tp_name; char *tp_name;
PyObject *tmp; PyObject *tmp;
if (!(type->tp_flags & Py_TPFLAGS_HEAPTYPE)) { if (!check_set_special_type_attr(type, value, "__name__"))
PyErr_Format(PyExc_TypeError,
"can't set %s.__name__", type->tp_name);
return -1; return -1;
}
if (!value) {
PyErr_Format(PyExc_TypeError,
"can't delete %s.__name__", type->tp_name);
return -1;
}
if (!PyUnicode_Check(value)) { if (!PyUnicode_Check(value)) {
PyErr_Format(PyExc_TypeError, PyErr_Format(PyExc_TypeError,
"can only assign string to %s.__name__, not '%s'", "can only assign string to %s.__name__, not '%s'",
@ -301,16 +309,8 @@ type_module(PyTypeObject *type, void *context)
static int static int
type_set_module(PyTypeObject *type, PyObject *value, void *context) type_set_module(PyTypeObject *type, PyObject *value, void *context)
{ {
if (!(type->tp_flags & Py_TPFLAGS_HEAPTYPE)) { if (!check_set_special_type_attr(type, value, "__module__"))
PyErr_Format(PyExc_TypeError,
"can't set %s.__module__", type->tp_name);
return -1; return -1;
}
if (!value) {
PyErr_Format(PyExc_TypeError,
"can't delete %s.__module__", type->tp_name);
return -1;
}
PyType_Modified(type); PyType_Modified(type);
@ -433,16 +433,8 @@ type_set_bases(PyTypeObject *type, PyObject *value, void *context)
PyTypeObject *new_base, *old_base; PyTypeObject *new_base, *old_base;
PyObject *old_bases, *old_mro; PyObject *old_bases, *old_mro;
if (!(type->tp_flags & Py_TPFLAGS_HEAPTYPE)) { if (!check_set_special_type_attr(type, value, "__bases__"))
PyErr_Format(PyExc_TypeError,
"can't set %s.__bases__", type->tp_name);
return -1; return -1;
}
if (!value) {
PyErr_Format(PyExc_TypeError,
"can't delete %s.__bases__", type->tp_name);
return -1;
}
if (!PyTuple_Check(value)) { if (!PyTuple_Check(value)) {
PyErr_Format(PyExc_TypeError, PyErr_Format(PyExc_TypeError,
"can only assign tuple to %s.__bases__, not %s", "can only assign tuple to %s.__bases__, not %s",