Kaydet (Commit) 94c65d9a authored tarafından Benjamin Peterson's avatar Benjamin Peterson

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
........
üst 14a3dd71
...@@ -1595,7 +1595,11 @@ order (MRO) for bases """ ...@@ -1595,7 +1595,11 @@ order (MRO) for bases """
def __get__(self, obj, owner): def __get__(self, obj, owner):
record.append(1) record.append(1)
return self.impl.__get__(obj, owner) 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: for name, runner, meth_impl, ok, env in specials:
class X(Checker): class X(Checker):
...@@ -1614,6 +1618,18 @@ order (MRO) for bases """ ...@@ -1614,6 +1618,18 @@ order (MRO) for bases """
runner(X()) runner(X())
self.assertEqual(record, [1], name) 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): def test_specials(self):
# Testing special operators... # Testing special operators...
# Test operators like __hash__ for which a built-in default exists # Test operators like __hash__ for which a built-in default exists
......
...@@ -90,8 +90,12 @@ _PyObject_LengthHint(PyObject *o, Py_ssize_t defaultvalue) ...@@ -90,8 +90,12 @@ _PyObject_LengthHint(PyObject *o, Py_ssize_t defaultvalue)
/* try o.__length_hint__() */ /* try o.__length_hint__() */
hintmeth = _PyObject_LookupSpecial(o, "__length_hint__", &hintstrobj); hintmeth = _PyObject_LookupSpecial(o, "__length_hint__", &hintstrobj);
if (hintmeth == NULL) if (hintmeth == NULL) {
return defaultvalue; if (PyErr_Occurred())
return -1;
else
return defaultvalue;
}
ro = PyObject_CallFunctionObjArgs(hintmeth, NULL); ro = PyObject_CallFunctionObjArgs(hintmeth, NULL);
Py_DECREF(hintmeth); Py_DECREF(hintmeth);
if (ro == NULL) { if (ro == NULL) {
...@@ -2592,6 +2596,8 @@ PyObject_IsInstance(PyObject *inst, PyObject *cls) ...@@ -2592,6 +2596,8 @@ PyObject_IsInstance(PyObject *inst, PyObject *cls)
} }
return ok; return ok;
} }
else if (PyErr_Occurred())
return -1;
return recursive_isinstance(inst, cls); return recursive_isinstance(inst, cls);
} }
...@@ -2655,6 +2661,8 @@ PyObject_IsSubclass(PyObject *derived, PyObject *cls) ...@@ -2655,6 +2661,8 @@ PyObject_IsSubclass(PyObject *derived, PyObject *cls)
} }
return ok; return ok;
} }
else if (PyErr_Occurred())
return -1;
return recursive_issubclass(derived, cls); return recursive_issubclass(derived, cls);
} }
......
...@@ -238,6 +238,8 @@ reversed_new(PyTypeObject *type, PyObject *args, PyObject *kwds) ...@@ -238,6 +238,8 @@ reversed_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Py_DECREF(reversed_meth); Py_DECREF(reversed_meth);
return res; return res;
} }
else if (PyErr_Occurred())
return NULL;
if (!PySequence_Check(seq)) { if (!PySequence_Check(seq)) {
PyErr_SetString(PyExc_TypeError, PyErr_SetString(PyExc_TypeError,
......
...@@ -497,6 +497,8 @@ PyObject_Bytes(PyObject *v) ...@@ -497,6 +497,8 @@ PyObject_Bytes(PyObject *v)
} }
return result; return result;
} }
else if (PyErr_Occurred())
return NULL;
return PyBytes_FromObject(v); return PyBytes_FromObject(v);
} }
......
...@@ -652,10 +652,12 @@ sys_getsizeof(PyObject *self, PyObject *args, PyObject *kwds) ...@@ -652,10 +652,12 @@ sys_getsizeof(PyObject *self, PyObject *args, PyObject *kwds)
method = _PyObject_LookupSpecial(o, "__sizeof__", method = _PyObject_LookupSpecial(o, "__sizeof__",
&str__sizeof__); &str__sizeof__);
if (method == NULL) if (method == NULL) {
PyErr_Format(PyExc_TypeError, if (!PyErr_Occurred())
"Type %.100s doesn't define __sizeof__", PyErr_Format(PyExc_TypeError,
Py_TYPE(o)->tp_name); "Type %.100s doesn't define __sizeof__",
Py_TYPE(o)->tp_name);
}
else { else {
res = PyObject_CallFunctionObjArgs(method, NULL); res = PyObject_CallFunctionObjArgs(method, NULL);
Py_DECREF(method); 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