[Python-checkins] python/dist/src/Objects typeobject.c,2.191,2.192

mwh@users.sourceforge.net mwh@users.sourceforge.net
Wed, 27 Nov 2002 07:20:21 -0800


Update of /cvsroot/python/python/dist/src/Objects
In directory sc8-pr-cvs1:/tmp/cvs-serv8099/Objects

Modified Files:
	typeobject.c 
Log Message:
Readjustments to the way we cope with exceptions from subclasses'
mro() methods.  Now any exception aborts the whole __bases__ change.

And more tests.


Index: typeobject.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Objects/typeobject.c,v
retrieving revision 2.191
retrieving revision 2.192
diff -C2 -d -r2.191 -r2.192
*** typeobject.c	27 Nov 2002 10:24:43 -0000	2.191
--- typeobject.c	27 Nov 2002 15:20:18 -0000	2.192
***************
*** 143,151 ****
  
  static int
! mro_subclasses(PyTypeObject *type)
  {
  	PyTypeObject *subclass;
  	PyObject *ref, *subclasses, *old_mro;
! 	int i, n, r = 0;
  
  	subclasses = type->tp_subclasses;
--- 143,151 ----
  
  static int
! mro_subclasses(PyTypeObject *type, PyObject* temp)
  {
  	PyTypeObject *subclass;
  	PyObject *ref, *subclasses, *old_mro;
! 	int i, n;
  
  	subclasses = type->tp_subclasses;
***************
*** 165,177 ****
  		if (mro_internal(subclass) < 0) {
  			subclass->tp_mro = old_mro;
! 			r = -1;
  		}
  		else {
! 			Py_DECREF(old_mro);
  		}
! 		if (mro_subclasses(subclass) < 0)
! 			r = -1;
  	}
! 	return r;
  }
  
--- 165,182 ----
  		if (mro_internal(subclass) < 0) {
  			subclass->tp_mro = old_mro;
! 			return -1;
  		}
  		else {
! 			PyObject* tuple;
! 			tuple = Py_BuildValue("OO", subclass, old_mro);
! 			if (!tuple)
! 				return -1;
! 			if (PyList_Append(temp, tuple) < 0)
! 				return -1;
  		}
! 		if (mro_subclasses(subclass, temp) < 0)
! 			return -1;
  	}
! 	return 0;
  }
  
***************
*** 180,184 ****
  {
  	int i, r = 0;
! 	PyObject* ob;
  	PyTypeObject *new_base, *old_base;
  	PyObject *old_bases, *old_mro;
--- 185,189 ----
  {
  	int i, r = 0;
! 	PyObject *ob, *temp;
  	PyTypeObject *new_base, *old_base;
  	PyObject *old_bases, *old_mro;
***************
*** 248,253 ****
  	}
  
! 	if (mro_subclasses(type) < 0)
! 		r = -1;
  
  	/* any base that was in __bases__ but now isn't, we
--- 253,275 ----
  	}
  
! 	temp = PyList_New(0);
! 
! 	r = mro_subclasses(type, temp);
! 
! 	if (r < 0) {
! 		for (i = 0; i < PyList_Size(temp); i++) {
! 			PyTypeObject* cls;
! 			PyObject* mro;
! 			PyArg_ParseTuple(PyList_GetItem(temp, i),
! 					 "OO", &cls, &mro);
! 			Py_DECREF(cls->tp_mro);
! 			cls->tp_mro = mro;
! 			Py_INCREF(cls->tp_mro);
! 		}
! 		Py_DECREF(temp);
! 		return r;
! 	}
! 
! 	Py_DECREF(temp);
  
  	/* any base that was in __bases__ but now isn't, we