]> granicus.if.org Git - python/commitdiff
Safety measures now that str and tuple are subclassable:
authorGuido van Rossum <guido@python.org>
Thu, 30 Aug 2001 04:43:35 +0000 (04:43 +0000)
committerGuido van Rossum <guido@python.org>
Thu, 30 Aug 2001 04:43:35 +0000 (04:43 +0000)
If tp_itemsize of the basetype is nonzero, only allow empty __slots__
(declaring that no __dict__ should be added), and don't add a weakref
offset.

Objects/typeobject.c

index 559c41b6e82bbf61168e328d842ca942580113c7..719a0a4021e697e4f4c2ca532efd8910e6b03ef7 100644 (file)
@@ -712,6 +712,13 @@ type_new(PyTypeObject *metatype, PyObject *args, PyObject *kwds)
                if (slots == NULL)
                        return NULL;
                nslots = PyTuple_GET_SIZE(slots);
+               if (nslots > 0 && base->tp_itemsize != 0) {
+                       PyErr_Format(PyExc_TypeError,
+                                    "nonempty __slots__ "
+                                    "not supported for subtype of '%s'",
+                                    base->tp_name);
+                       return NULL;
+               }
                for (i = 0; i < nslots; i++) {
                        if (!PyString_Check(PyTuple_GET_ITEM(slots, i))) {
                                PyErr_SetString(PyExc_TypeError,
@@ -728,7 +735,8 @@ type_new(PyTypeObject *metatype, PyObject *args, PyObject *kwds)
                nslots++;
                add_dict++;
        }
-       if (slots == NULL && base->tp_weaklistoffset == 0) {
+       if (slots == NULL && base->tp_weaklistoffset == 0 &&
+           base->tp_itemsize == 0) {
                nslots++;
                add_weak++;
        }