diff options
Diffstat (limited to 'Objects/abstract.c')
-rw-r--r-- | Objects/abstract.c | 38 |
1 files changed, 25 insertions, 13 deletions
diff --git a/Objects/abstract.c b/Objects/abstract.c index 4da7e0035e..5fb7bfc01e 100644 --- a/Objects/abstract.c +++ b/Objects/abstract.c @@ -2926,14 +2926,19 @@ PyObject_IsInstance(PyObject *inst, PyObject *cls) 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; + } + } + else { + checker = _PyObject_LookupSpecial(cls, "__instancecheck__", &name); } - checker = PyObject_GetAttr(cls, name); - if (checker == NULL && PyErr_Occurred()) - PyErr_Clear(); if (checker != NULL) { PyObject *res; int ok = -1; @@ -3008,14 +3013,21 @@ PyObject_IsSubclass(PyObject *derived, PyObject *cls) 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); + } + else { + checker = _PyObject_LookupSpecial(cls, "__subclasscheck__", &name); } - PyErr_Fetch(&t, &v, &tb); - checker = PyObject_GetAttr(cls, name); - PyErr_Restore(t, v, tb); if (checker != NULL) { PyObject *res; int ok = -1; |