Mercurial > cpython-lru_cache-weakref
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;
