summaryrefslogtreecommitdiffstats
path: root/Objects/abstract.c
diff options
context:
space:
mode:
authorBenjamin Peterson <benjamin@python.org>2009-05-16 21:44:25 (GMT)
committerBenjamin Peterson <benjamin@python.org>2009-05-16 21:44:25 (GMT)
commitfb6fb062e8f677dd63943f3a4b8a45c6665b3418 (patch)
tree47ebfca4866021ac2ed5499d7d1dd6ad944dde08 /Objects/abstract.c
parent757b3c90e63d323ae25cffbfce84112042320e58 (diff)
downloadcpython-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.c38
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;