From 41eb14dffab5c5b559028f062d209b5cde8224f4 Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Thu, 30 Aug 2001 23:13:11 +0000 Subject: Give 'super' a decent repr(), and readonly attributes to access the type and obj properties. The "bogus super object" message is gone -- this will now just raise an AttributeError. --- Objects/typeobject.c | 47 ++++++++++++++++++++++++++++++++++++----------- 1 file changed, 36 insertions(+), 11 deletions(-) diff --git a/Objects/typeobject.c b/Objects/typeobject.c index 303dead..35dc76f 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -3159,6 +3159,12 @@ typedef struct { PyObject *obj; } superobject; +static struct memberlist super_members[] = { + {"__type__", T_OBJECT, offsetof(superobject, type), READONLY}, + {"__obj__", T_OBJECT, offsetof(superobject, obj), READONLY}, + {0} +}; + static void super_dealloc(PyObject *self) { @@ -3170,6 +3176,22 @@ super_dealloc(PyObject *self) } static PyObject * +super_repr(PyObject *self) +{ + superobject *su = (superobject *)self; + + if (su->obj) + return PyString_FromFormat( + ", <%s object>>", + su->type ? su->type->tp_name : "NULL", + su->obj->ob_type->tp_name); + else + return PyString_FromFormat( + ", NULL>", + su->type ? su->type->tp_name : "NULL"); +} + +static PyObject * super_getattro(PyObject *self, PyObject *name) { superobject *su = (superobject *)self; @@ -3180,26 +3202,29 @@ super_getattro(PyObject *self, PyObject *name) int i, n; mro = su->obj->ob_type->tp_mro; - assert(mro != NULL && PyTuple_Check(mro)); - n = PyTuple_GET_SIZE(mro); + if (mro == NULL) + n = 0; + else { + assert(PyTuple_Check(mro)); + n = PyTuple_GET_SIZE(mro); + } for (i = 0; i < n; i++) { if ((PyObject *)(su->type) == PyTuple_GET_ITEM(mro, i)) break; } if (i >= n && PyType_Check(su->obj)) { mro = ((PyTypeObject *)(su->obj))->tp_mro; - assert(mro != NULL && PyTuple_Check(mro)); - n = PyTuple_GET_SIZE(mro); + if (mro == NULL) + n = 0; + else { + assert(PyTuple_Check(mro)); + n = PyTuple_GET_SIZE(mro); + } for (i = 0; i < n; i++) { if ((PyObject *)(su->type) == PyTuple_GET_ITEM(mro, i)) break; } - if (i >= n) { - PyErr_SetString(PyExc_TypeError, - "bogus super object"); - return NULL; - } } i++; res = NULL; @@ -3292,7 +3317,7 @@ PyTypeObject PySuper_Type = { 0, /* tp_getattr */ 0, /* tp_setattr */ 0, /* tp_compare */ - 0, /* tp_repr */ + super_repr, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ 0, /* tp_as_mapping */ @@ -3311,7 +3336,7 @@ PyTypeObject PySuper_Type = { 0, /* tp_iter */ 0, /* tp_iternext */ 0, /* tp_methods */ - 0, /* tp_members */ + super_members, /* tp_members */ 0, /* tp_getset */ 0, /* tp_base */ 0, /* tp_dict */ -- cgit v0.12