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.
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 @@
 	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 @@
 }
 
 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 @@
 		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 @@
 	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 @@
 	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 */