[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 */