Index: abstract.c =================================================================== --- abstract.c (revision 62102) +++ abstract.c (working copy) @@ -2940,6 +2940,12 @@ return recursive_isinstance(inst, cls, Py_GetRecursionLimit()); } +int +PyObject_RealIsInstance(PyObject *inst, PyObject *cls) +{ + return recursive_isinstance(inst, cls, Py_GetRecursionLimit()); +} + static int recursive_issubclass(PyObject *derived, PyObject *cls, int recursion_depth) { @@ -2990,6 +2996,12 @@ } int +PyObject_RealIsSubclass(PyObject *inst, PyObject *cls) +{ + return recursive_issubclass(inst, cls, Py_GetRecursionLimit()); +} + +int PyObject_IsSubclass(PyObject *derived, PyObject *cls) { static PyObject *name = NULL; Index: typeobject.c =================================================================== --- typeobject.c (revision 62102) +++ typeobject.c (working copy) @@ -572,6 +572,55 @@ return result; } +extern int +PyObject_RealIsInstance(PyObject *inst, PyObject *cls); + +static PyObject * +type___instancecheck__(PyObject *type, void *inst) +{ + switch (PyObject_RealIsInstance(inst, type)) { + case -1: + return NULL; + case 0: + Py_RETURN_FALSE; + default: + Py_RETURN_TRUE; + } +} + + +static PyObject * +type_get_instancecheck(PyTypeObject *type, void *context) +{ + static PyMethodDef ml = {"__instancecheck__", + type___instancecheck__, METH_O }; + return PyCFunction_New(&ml, type); +} + +extern int +PyObject_RealIsSubclass(PyObject *inst, PyObject *cls); + +static PyObject * +type___subclasscheck__(PyObject *type, PyObject *inst) +{ + switch (PyObject_RealIsSubclass(inst, type)) { + case -1: + return NULL; + case 0: + Py_RETURN_FALSE; + default: + Py_RETURN_TRUE; + } +} + +static PyObject * +type_get_subclasscheck(PyTypeObject *type, void *context) +{ + static PyMethodDef ml = {"__subclasscheck__", + type___subclasscheck__, METH_O }; + return PyCFunction_New(&ml, type); +} + static PyGetSetDef type_getsets[] = { {"__name__", (getter)type_name, (setter)type_set_name, NULL}, {"__bases__", (getter)type_get_bases, (setter)type_set_bases, NULL}, @@ -580,6 +629,8 @@ (setter)type_set_abstractmethods, NULL}, {"__dict__", (getter)type_dict, NULL, NULL}, {"__doc__", (getter)type_get_doc, NULL, NULL}, + {"__instancecheck__", (getter)type_get_instancecheck, NULL, NULL}, + {"__subclasscheck__", (getter)type_get_subclasscheck, NULL, NULL}, {0} };