Merged revisions 72907 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk ........ r72907 | benjamin.peterson | 2009-05-24 21:40:21 -0500 (Sun, 24 May 2009) | 1 line handle errors from _PyObject_LookupSpecial when __get__ fails ........
This commit is contained in:
parent
14a3dd716d
commit
94c65d9a8f
|
@ -1595,7 +1595,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):
|
||||
|
@ -1614,6 +1618,18 @@ order (MRO) for bases """
|
|||
runner(X())
|
||||
self.assertEqual(record, [1], name)
|
||||
|
||||
class X(Checker):
|
||||
pass
|
||||
for attr, obj in env.items():
|
||||
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
|
||||
|
|
|
@ -90,8 +90,12 @@ _PyObject_LengthHint(PyObject *o, Py_ssize_t defaultvalue)
|
|||
|
||||
/* try o.__length_hint__() */
|
||||
hintmeth = _PyObject_LookupSpecial(o, "__length_hint__", &hintstrobj);
|
||||
if (hintmeth == NULL)
|
||||
return defaultvalue;
|
||||
if (hintmeth == NULL) {
|
||||
if (PyErr_Occurred())
|
||||
return -1;
|
||||
else
|
||||
return defaultvalue;
|
||||
}
|
||||
ro = PyObject_CallFunctionObjArgs(hintmeth, NULL);
|
||||
Py_DECREF(hintmeth);
|
||||
if (ro == NULL) {
|
||||
|
@ -2592,6 +2596,8 @@ PyObject_IsInstance(PyObject *inst, PyObject *cls)
|
|||
}
|
||||
return ok;
|
||||
}
|
||||
else if (PyErr_Occurred())
|
||||
return -1;
|
||||
return recursive_isinstance(inst, cls);
|
||||
}
|
||||
|
||||
|
@ -2655,6 +2661,8 @@ PyObject_IsSubclass(PyObject *derived, PyObject *cls)
|
|||
}
|
||||
return ok;
|
||||
}
|
||||
else if (PyErr_Occurred())
|
||||
return -1;
|
||||
return recursive_issubclass(derived, cls);
|
||||
}
|
||||
|
||||
|
|
|
@ -238,6 +238,8 @@ reversed_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
|
|||
Py_DECREF(reversed_meth);
|
||||
return res;
|
||||
}
|
||||
else if (PyErr_Occurred())
|
||||
return NULL;
|
||||
|
||||
if (!PySequence_Check(seq)) {
|
||||
PyErr_SetString(PyExc_TypeError,
|
||||
|
|
|
@ -497,6 +497,8 @@ PyObject_Bytes(PyObject *v)
|
|||
}
|
||||
return result;
|
||||
}
|
||||
else if (PyErr_Occurred())
|
||||
return NULL;
|
||||
return PyBytes_FromObject(v);
|
||||
}
|
||||
|
||||
|
|
|
@ -652,10 +652,12 @@ sys_getsizeof(PyObject *self, PyObject *args, PyObject *kwds)
|
|||
|
||||
method = _PyObject_LookupSpecial(o, "__sizeof__",
|
||||
&str__sizeof__);
|
||||
if (method == NULL)
|
||||
PyErr_Format(PyExc_TypeError,
|
||||
"Type %.100s doesn't define __sizeof__",
|
||||
Py_TYPE(o)->tp_name);
|
||||
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);
|
||||
|
|
Loading…
Reference in New Issue