summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGuido van Rossum <guido@python.org>2001-08-12 05:17:56 (GMT)
committerGuido van Rossum <guido@python.org>2001-08-12 05:17:56 (GMT)
commit8e24818cf4919bb7caff7b12a4d7520865c3f0ce (patch)
treee9bf1dd788627d0b3d7c9aa2e77bf396197599e9
parenta45da92484ceececf1cf32b4dfb16004945b001e (diff)
downloadcpython-8e24818cf4919bb7caff7b12a4d7520865c3f0ce.zip
cpython-8e24818cf4919bb7caff7b12a4d7520865c3f0ce.tar.gz
cpython-8e24818cf4919bb7caff7b12a4d7520865c3f0ce.tar.bz2
Make dynamic types work as intended. Or at least more so.
XXX There are still some loose ends: repr(), str(), hash() and comparisons don't inherit a default implementation from object. This must be resolved similarly to the way it's resolved for classic instances.
-rw-r--r--Objects/typeobject.c57
1 files changed, 35 insertions, 22 deletions
diff --git a/Objects/typeobject.c b/Objects/typeobject.c
index 098d591..e8b634e 100644
--- a/Objects/typeobject.c
+++ b/Objects/typeobject.c
@@ -667,7 +667,8 @@ type_new(PyTypeObject *metatype, PyObject *args, PyObject *kwds)
}
/* Override slots that deserve it */
- override_slots(type, type->tp_defined);
+ if (!PyType_HasFeature(type, Py_TPFLAGS_DYNAMICTYPE))
+ override_slots(type, type->tp_defined);
return (PyObject *)type;
}
@@ -850,6 +851,23 @@ object_dealloc(PyObject *self)
self->ob_type->tp_free(self);
}
+#if 0
+static PyObject *
+object_repr(PyObject *self)
+{
+ char buf[120];
+
+ sprintf(buf, "<%.80s object at %p>", self->ob_type->tp_name, self);
+ return PyString_FromString(buf);
+}
+
+static long
+object_hash(PyObject *self)
+{
+ return _Py_HashPointer(self);
+}
+#endif
+
static void
object_free(PyObject *self)
{
@@ -1245,9 +1263,8 @@ PyType_Ready(PyTypeObject *type)
/* Initialize tp_dict properly */
if (PyType_HasFeature(type, Py_TPFLAGS_DYNAMICTYPE)) {
- /* XXX This is not enough -- see checkin msg 2.30. */
- if (type->tp_base != NULL)
- inherit_slots(type, type->tp_base);
+ /* For a dynamic type, all slots are overridden */
+ override_slots(type, NULL);
}
else {
/* For a static type, tp_dict is the consolidation
@@ -2311,22 +2328,17 @@ static PyObject *
slot_tp_getattro(PyObject *self, PyObject *name)
{
PyTypeObject *tp = self->ob_type;
- PyObject *dict = NULL;
PyObject *getattr;
+ static PyObject *getattr_str = NULL;
- if (tp->tp_flags & Py_TPFLAGS_HEAPTYPE)
- dict = tp->tp_dict;
- if (dict == NULL) {
- PyErr_Format(PyExc_SystemError,
- "'%.100s' type object has no __dict__???",
- tp->tp_name);
- return NULL;
- }
- getattr = PyDict_GetItemString(dict, "__getattr__");
- if (getattr == NULL) {
- PyErr_SetString(PyExc_AttributeError, "__getattr__");
- return NULL;
+ if (getattr_str == NULL) {
+ getattr_str = PyString_InternFromString("__getattr__");
+ if (getattr_str == NULL)
+ return NULL;
}
+ getattr = _PyType_Lookup(tp, getattr_str);
+ if (getattr == NULL)
+ return PyObject_GenericGetAttr(self, name);
return PyObject_CallFunction(getattr, "OO", self, name);
}
@@ -2456,22 +2468,22 @@ override_slots(PyTypeObject *type, PyObject *dict)
PyNumberMethods *nb = type->tp_as_number;
#define SQSLOT(OPNAME, SLOTNAME, FUNCNAME) \
- if (PyDict_GetItemString(dict, OPNAME)) { \
+ if (dict == NULL || PyDict_GetItemString(dict, OPNAME)) { \
sq->SLOTNAME = FUNCNAME; \
}
#define MPSLOT(OPNAME, SLOTNAME, FUNCNAME) \
- if (PyDict_GetItemString(dict, OPNAME)) { \
+ if (dict == NULL || PyDict_GetItemString(dict, OPNAME)) { \
mp->SLOTNAME = FUNCNAME; \
}
#define NBSLOT(OPNAME, SLOTNAME, FUNCNAME) \
- if (PyDict_GetItemString(dict, OPNAME)) { \
+ if (dict == NULL || PyDict_GetItemString(dict, OPNAME)) { \
nb->SLOTNAME = FUNCNAME; \
}
#define TPSLOT(OPNAME, SLOTNAME, FUNCNAME) \
- if (PyDict_GetItemString(dict, OPNAME)) { \
+ if (dict == NULL || PyDict_GetItemString(dict, OPNAME)) { \
type->SLOTNAME = FUNCNAME; \
}
@@ -2534,7 +2546,8 @@ override_slots(PyTypeObject *type, PyObject *dict)
NBSLOT("__itruediv__", nb_inplace_true_divide,
slot_nb_inplace_true_divide);
- if (PyDict_GetItemString(dict, "__str__") ||
+ if (dict == NULL ||
+ PyDict_GetItemString(dict, "__str__") ||
PyDict_GetItemString(dict, "__repr__"))
type->tp_print = NULL;