diff -r b15c5a66213f Objects/abstract.c --- a/Objects/abstract.c Thu Oct 02 12:39:02 2014 +0200 +++ b/Objects/abstract.c Fri Oct 03 08:59:39 2014 +0200 @@ -2538,6 +2538,11 @@ PyObject_IsInstance(PyObject *inst, PyOb if (Py_TYPE(inst) == (PyTypeObject *)cls) return 1; + /* We know what type's __instancecheck__ does. */ + if (PyType_CheckExact(cls)) { + return recursive_isinstance(inst, cls); + } + if (PyTuple_Check(cls)) { Py_ssize_t i; Py_ssize_t n; @@ -2576,6 +2581,7 @@ PyObject_IsInstance(PyObject *inst, PyOb } else if (PyErr_Occurred()) return -1; + /* Probably never reached anymore. */ return recursive_isinstance(inst, cls); } @@ -2603,6 +2609,14 @@ PyObject_IsSubclass(PyObject *derived, P _Py_IDENTIFIER(__subclasscheck__); PyObject *checker; + /* We know what type's __subclasscheck__ does. */ + if (PyType_CheckExact(cls)) { + /* Quick test for an exact match */ + if (derived == cls) + return 1; + return recursive_issubclass(derived, cls); + } + if (PyTuple_Check(cls)) { Py_ssize_t i; Py_ssize_t n; @@ -2641,6 +2655,7 @@ PyObject_IsSubclass(PyObject *derived, P } else if (PyErr_Occurred()) return -1; + /* Probably never reached anymore. */ return recursive_issubclass(derived, cls); }