diff Objects/abstract.c @ 54118:ae006386ec39 legacy-trunk

properly lookup __instancecheck__ and __subclasscheck__
author Benjamin Peterson <benjamin@python.org>
date Sat, 16 May 2009 21:44:25 +0000
parents aa41c8c96055
children 69567a05d5e6
line wrap: on
line diff
--- a/Objects/abstract.c	Sat May 16 18:44:34 2009 +0000
+++ b/Objects/abstract.c	Sat May 16 21:44:25 2009 +0000
@@ -2926,14 +2926,19 @@
 		Py_LeaveRecursiveCall();
 		return r;
 	}
-	if (name == NULL) {
-		name = PyString_InternFromString("__instancecheck__");
-		if (name == NULL)
-			return -1;
+
+	if (PyInstance_Check(cls)) {
+		checker = PyObject_GetAttrString(cls, "__instancecheck__");
+		if (checker == NULL) {
+			if (PyErr_ExceptionMatches(PyExc_AttributeError))
+				PyErr_Clear();
+			else
+				return -1;
+		}
 	}
-	checker = PyObject_GetAttr(cls, name);
-	if (checker == NULL && PyErr_Occurred())
-		PyErr_Clear();
+	else {
+		checker = _PyObject_LookupSpecial(cls, "__instancecheck__", &name);
+	}
 	if (checker != NULL) {
 		PyObject *res;
 		int ok = -1;
@@ -3008,14 +3013,21 @@
  		Py_LeaveRecursiveCall();
  		return r;
  	}
-	if (name == NULL) {
-		name = PyString_InternFromString("__subclasscheck__");
-		if (name == NULL)
+	if (PyInstance_Check(cls)) {
+		PyErr_Fetch(&t, &v, &tb);
+		checker = PyObject_GetAttr(cls, name);
+		if (checker == NULL &&
+		    !PyErr_ExceptionMatches(PyExc_AttributeError)) {
+			Py_XDECREF(t);
+			Py_XDECREF(v);
+			Py_XDECREF(tb);
 			return -1;
+		}
+		PyErr_Restore(t, v, tb);
 	}
-	PyErr_Fetch(&t, &v, &tb);
-	checker = PyObject_GetAttr(cls, name);
-	PyErr_Restore(t, v, tb);
+	else {
+		checker = _PyObject_LookupSpecial(cls, "__subclasscheck__", &name);
+	}
 	if (checker != NULL) {
 		PyObject *res;
 		int ok = -1;