Commit 87e5006d authored by Benjamin Peterson's avatar Benjamin Peterson

handle errors from _PyObject_LookupSpecial when __get__ fails

parent 176a56c6
......@@ -1722,7 +1722,11 @@ order (MRO) for bases """
def __get__(self, obj, owner):
record.append(1)
return self.impl.__get__(obj, owner)
class MyException(Exception):
pass
class ErrDescr(object):
def __get__(self, obj, owner):
raise MyException
for name, runner, meth_impl, ok, env in specials:
class X(Checker):
......@@ -1741,6 +1745,18 @@ order (MRO) for bases """
runner(X())
self.assertEqual(record, [1], name)
class X(Checker):
pass
for attr, obj in env.iteritems():
setattr(X, attr, obj)
setattr(X, name, ErrDescr())
try:
runner(X())
except MyException:
pass
else:
self.fail("{0!r} didn't raise".format(name))
def test_specials(self):
# Testing special operators...
# Test operators like __hash__ for which a built-in default exists
......
......@@ -111,8 +111,12 @@ _PyObject_LengthHint(PyObject *o, Py_ssize_t defaultvalue)
return defaultvalue;
/* try o.__length_hint__() */
hintmeth = _PyObject_LookupSpecial(o, "__length_hint__", &hintstrobj);
if (hintmeth == NULL)
if (hintmeth == NULL) {
if (PyErr_Occurred())
return -1;
else
return defaultvalue;
}
ro = PyObject_CallFunctionObjArgs(hintmeth, NULL);
Py_DECREF(hintmeth);
if (ro == NULL) {
......@@ -2945,6 +2949,8 @@ PyObject_IsInstance(PyObject *inst, PyObject *cls)
}
return ok;
}
else if (PyErr_Occurred())
return -1;
}
return recursive_isinstance(inst, cls);
}
......@@ -3021,6 +3027,9 @@ PyObject_IsSubclass(PyObject *derived, PyObject *cls)
}
return ok;
}
else if (PyErr_Occurred()) {
return -1;
}
}
return recursive_issubclass(derived, cls);
}
......
......@@ -241,9 +241,12 @@ reversed_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
return NULL;
}
}
else
else {
reversed_meth = _PyObject_LookupSpecial(seq, "__reversed__",
&reversed_cache);
if (reversed_meth == NULL && PyErr_Occurred())
return NULL;
}
if (reversed_meth != NULL) {
PyObject *res = PyObject_CallFunctionObjArgs(reversed_meth, NULL);
Py_DECREF(reversed_meth);
......
......@@ -509,6 +509,8 @@ PyObject_Unicode(PyObject *v)
res = PyObject_CallFunctionObjArgs(func, NULL);
Py_DECREF(func);
}
else if (PyErr_Occurred())
return NULL;
}
/* Didn't find __unicode__ */
......
......@@ -669,10 +669,12 @@ sys_getsizeof(PyObject *self, PyObject *args, PyObject *kwds)
else {
PyObject *method = _PyObject_LookupSpecial(o, "__sizeof__",
&str__sizeof__);
if (method == NULL)
if (method == NULL) {
if (!PyErr_Occurred())
PyErr_Format(PyExc_TypeError,
"Type %.100s doesn't define __sizeof__",
Py_TYPE(o)->tp_name);
}
else {
res = PyObject_CallFunctionObjArgs(method, NULL);
Py_DECREF(method);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment