Make isinstance() more permissive in what types of arguments it
accepts. Clarify exception messages for isinstance() and
issubclass().  Closes bug #124106.
diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c
index 7c8cf18..fa560f7 100644
--- a/Python/bltinmodule.c
+++ b/Python/bltinmodule.c
@@ -1995,7 +1995,7 @@
 With an argument, equivalent to object.__dict__.";
 
 static int
-abstract_issubclass(PyObject *derived, PyObject *cls, char *err, int first)
+abstract_issubclass(PyObject *derived, PyObject *cls, int first)
 {
 	static PyObject *__bases__ = NULL;
 	PyObject *bases;
@@ -2012,7 +2012,8 @@
 		bases = PyObject_GetAttr(cls, __bases__);
 		if (bases == NULL || !PyTuple_Check(bases)) {
 		        Py_XDECREF(bases);
-	        	PyErr_SetString(PyExc_TypeError, err);
+	        	PyErr_SetString(PyExc_TypeError,
+					"arg 2 must be a class or type");
 			return -1;
 		}
 		Py_DECREF(bases);
@@ -2024,14 +2025,14 @@
 	bases = PyObject_GetAttr(derived, __bases__);
 	if (bases == NULL || !PyTuple_Check(bases)) {
 	        Py_XDECREF(bases);
-	        PyErr_SetString(PyExc_TypeError, err);
+		PyErr_SetString(PyExc_TypeError,
+				"arg 2 must be a class or type");
 		return -1;
 	}
 
 	n = PyTuple_GET_SIZE(bases);
 	for (i = 0; i < n; i++) {
-		r = abstract_issubclass(PyTuple_GET_ITEM(bases, i),
-					cls, err, 0);
+		r = abstract_issubclass(PyTuple_GET_ITEM(bases, i), cls, 0);
 		if (r != 0)
 			break;
 	}
@@ -2071,25 +2072,17 @@
 		}
 		icls = PyObject_GetAttr(inst, __class__);
 		if (icls != NULL) {
-			retval = abstract_issubclass(
-				icls, cls,
-				"isinstance() arg 2 must be a class", 
-				1);
+			retval = abstract_issubclass( icls, cls, 1);
 			Py_DECREF(icls);
 			if (retval < 0)
 				return NULL;
 		}
 		else {
 			PyErr_SetString(PyExc_TypeError,
-					"isinstance() arg 2 must be a class");
+					"arg 2 must be a class or type");
 			return NULL;
 		}
 	}
-        else {
-		PyErr_SetString(PyExc_TypeError,
-				"isinstance() arg 2 must be a class");
-		return NULL;
-	}
 	return PyInt_FromLong(retval);
 }
 
@@ -2111,8 +2104,7 @@
 		return NULL;
 
 	if (!PyClass_Check(derived) || !PyClass_Check(cls)) {
-		retval = abstract_issubclass(
-				derived, cls, "arguments must be classes", 1);
+		retval = abstract_issubclass(derived, cls, 1);
 		if (retval < 0) 
 			return NULL;
 	}