diff options
author | Benjamin Peterson <benjamin@python.org> | 2009-05-16 21:44:25 (GMT) |
---|---|---|
committer | Benjamin Peterson <benjamin@python.org> | 2009-05-16 21:44:25 (GMT) |
commit | fb6fb062e8f677dd63943f3a4b8a45c6665b3418 (patch) | |
tree | 47ebfca4866021ac2ed5499d7d1dd6ad944dde08 /Objects/abstract.c | |
parent | 757b3c90e63d323ae25cffbfce84112042320e58 (diff) | |
download | cpython-fb6fb062e8f677dd63943f3a4b8a45c6665b3418.zip cpython-fb6fb062e8f677dd63943f3a4b8a45c6665b3418.tar.gz cpython-fb6fb062e8f677dd63943f3a4b8a45c6665b3418.tar.bz2 |
properly lookup __instancecheck__ and __subclasscheck__
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 4da7e00..5fb7bfc 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; |