summaryrefslogtreecommitdiffstats
path: root/Objects
diff options
context:
space:
mode:
authorGuido van Rossum <guido@python.org>2001-08-30 23:13:11 (GMT)
committerGuido van Rossum <guido@python.org>2001-08-30 23:13:11 (GMT)
commit41eb14dffab5c5b559028f062d209b5cde8224f4 (patch)
tree0d201bcddca6541f757033177dc0d310590150b8 /Objects
parent7561d9ead92250c19673bbe8119257dffbc0fbee (diff)
downloadcpython-41eb14dffab5c5b559028f062d209b5cde8224f4.zip
cpython-41eb14dffab5c5b559028f062d209b5cde8224f4.tar.gz
cpython-41eb14dffab5c5b559028f062d209b5cde8224f4.tar.bz2
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.
Diffstat (limited to 'Objects')
-rw-r--r--Objects/typeobject.c47
1 files 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(
+ "<super: <type '%s'>, <%s object>>",
+ su->type ? su->type->tp_name : "NULL",
+ su->obj->ob_type->tp_name);
+ else
+ return PyString_FromFormat(
+ "<super: <type '%s'>, 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 */