[Python-checkins] CVS: python/dist/src/Objects typeobject.c,2.55,2.56
Guido van Rossum
gvanrossum@users.sourceforge.net
Thu, 30 Aug 2001 16:13:13 -0700
Update of /cvsroot/python/python/dist/src/Objects
In directory usw-pr-cvs1:/tmp/cvs-serv13328
Modified Files:
typeobject.c
Log Message:
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.
Index: typeobject.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Objects/typeobject.c,v
retrieving revision 2.55
retrieving revision 2.56
diff -C2 -d -r2.55 -r2.56
*** typeobject.c 2001/08/30 20:07:55 2.55
--- typeobject.c 2001/08/30 23:13:11 2.56
***************
*** 3160,3163 ****
--- 3160,3169 ----
} 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)
***************
*** 3171,3174 ****
--- 3177,3196 ----
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)
{
***************
*** 3181,3186 ****
mro = su->obj->ob_type->tp_mro;
! assert(mro != NULL && PyTuple_Check(mro));
! n = PyTuple_GET_SIZE(mro);
for (i = 0; i < n; i++) {
if ((PyObject *)(su->type) == PyTuple_GET_ITEM(mro, i))
--- 3203,3212 ----
mro = su->obj->ob_type->tp_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))
***************
*** 3189,3194 ****
if (i >= n && PyType_Check(su->obj)) {
mro = ((PyTypeObject *)(su->obj))->tp_mro;
! assert(mro != NULL && PyTuple_Check(mro));
! n = PyTuple_GET_SIZE(mro);
for (i = 0; i < n; i++) {
if ((PyObject *)(su->type) ==
--- 3215,3224 ----
if (i >= n && PyType_Check(su->obj)) {
mro = ((PyTypeObject *)(su->obj))->tp_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) ==
***************
*** 3196,3204 ****
break;
}
- if (i >= n) {
- PyErr_SetString(PyExc_TypeError,
- "bogus super object");
- return NULL;
- }
}
i++;
--- 3226,3229 ----
***************
*** 3293,3297 ****
0, /* tp_setattr */
0, /* tp_compare */
! 0, /* tp_repr */
0, /* tp_as_number */
0, /* tp_as_sequence */
--- 3318,3322 ----
0, /* tp_setattr */
0, /* tp_compare */
! super_repr, /* tp_repr */
0, /* tp_as_number */
0, /* tp_as_sequence */
***************
*** 3312,3316 ****
0, /* tp_iternext */
0, /* tp_methods */
! 0, /* tp_members */
0, /* tp_getset */
0, /* tp_base */
--- 3337,3341 ----
0, /* tp_iternext */
0, /* tp_methods */
! super_members, /* tp_members */
0, /* tp_getset */
0, /* tp_base */