Readjustments to the way we cope with exceptions from subclasses'
mro() methods.  Now any exception aborts the whole __bases__ change.

And more tests.
diff --git a/Objects/typeobject.c b/Objects/typeobject.c
index 82237c8..949cef5 100644
--- a/Objects/typeobject.c
+++ b/Objects/typeobject.c
@@ -142,11 +142,11 @@
 static void update_all_slots(PyTypeObject *);
 
 static int
-mro_subclasses(PyTypeObject *type)
+mro_subclasses(PyTypeObject *type, PyObject* temp)
 {
 	PyTypeObject *subclass;
 	PyObject *ref, *subclasses, *old_mro;
-	int i, n, r = 0;
+	int i, n;
 
 	subclasses = type->tp_subclasses;
 	if (subclasses == NULL)
@@ -164,22 +164,27 @@
 		old_mro = subclass->tp_mro;
 		if (mro_internal(subclass) < 0) {
 			subclass->tp_mro = old_mro;
-			r = -1;
+			return -1;
 		}
 		else {
-			Py_DECREF(old_mro);
+			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) < 0)
-			r = -1;
+		if (mro_subclasses(subclass, temp) < 0)
+			return -1;
 	}
-	return r;
+	return 0;
 }
 
 static int
 type_set_bases(PyTypeObject *type, PyObject *value, void *context)
 {
 	int i, r = 0;
-	PyObject* ob;
+	PyObject *ob, *temp;
 	PyTypeObject *new_base, *old_base;
 	PyObject *old_bases, *old_mro;
 
@@ -247,8 +252,25 @@
 		return -1;
 	}
 
-	if (mro_subclasses(type) < 0)
-		r = -1;
+	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
 	   need to remove |type| from it's tp_subclasses.