[Python-checkins] cpython: factor out common checks for setting special type attributes

benjamin.peterson python-checkins at python.org
Wed Aug 17 19:04:29 CEST 2011


http://hg.python.org/cpython/rev/7fee7f9d2c03
changeset:   71894:7fee7f9d2c03
user:        Benjamin Peterson <benjamin at python.org>
date:        Wed Aug 17 11:54:03 2011 -0500
summary:
  factor out common checks for setting special type attributes

files:
  Objects/typeobject.c |  46 +++++++++++++------------------
  1 files changed, 19 insertions(+), 27 deletions(-)


diff --git a/Objects/typeobject.c b/Objects/typeobject.c
--- a/Objects/typeobject.c
+++ b/Objects/typeobject.c
@@ -201,6 +201,22 @@
     {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 @@
     char *tp_name;
     PyObject *tmp;
 
-    if (!(type->tp_flags & Py_TPFLAGS_HEAPTYPE)) {
-        PyErr_Format(PyExc_TypeError,
-                     "can't set %s.__name__", type->tp_name);
+    if (!check_set_special_type_attr(type, value, "__name__"))
         return -1;
-    }
-    if (!value) {
-        PyErr_Format(PyExc_TypeError,
-                     "can't delete %s.__name__", type->tp_name);
-        return -1;
-    }
     if (!PyUnicode_Check(value)) {
         PyErr_Format(PyExc_TypeError,
                      "can only assign string to %s.__name__, not '%s'",
@@ -301,16 +309,8 @@
 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);
+    if (!check_set_special_type_attr(type, value, "__module__"))
         return -1;
-    }
-    if (!value) {
-        PyErr_Format(PyExc_TypeError,
-                     "can't delete %s.__module__", type->tp_name);
-        return -1;
-    }
 
     PyType_Modified(type);
 
@@ -433,16 +433,8 @@
     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);
+    if (!check_set_special_type_attr(type, value, "__bases__"))
         return -1;
-    }
-    if (!value) {
-        PyErr_Format(PyExc_TypeError,
-                     "can't delete %s.__bases__", type->tp_name);
-        return -1;
-    }
     if (!PyTuple_Check(value)) {
         PyErr_Format(PyExc_TypeError,
              "can only assign tuple to %s.__bases__, not %s",

-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list