]> granicus.if.org Git - python/commitdiff
Merged revisions 72907 via svnmerge from
authorBenjamin Peterson <benjamin@python.org>
Mon, 25 May 2009 03:10:48 +0000 (03:10 +0000)
committerBenjamin Peterson <benjamin@python.org>
Mon, 25 May 2009 03:10:48 +0000 (03:10 +0000)
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
........

Lib/test/test_descr.py
Objects/abstract.c
Objects/enumobject.c
Objects/object.c
Python/sysmodule.c

index 32f9090d60c7d1603ce6f220728e50985770bfd3..adcb55f053a5fe05d7439919fcd235a167bc1e51 100644 (file)
@@ -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
index 56e5b717a6182c8e4ae804747c2ad3568137c769..3b2de9d6c1fe6bd92130a75bc2d4574e662391d0 100644 (file)
@@ -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);
 }
 
index f8e407282ee6e811c61e0670aa3fcbdb949545b1..62e55bb88a2c5c7883788930432d5e76265fdd35 100644 (file)
@@ -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,
index 58b70f09e74041251038dde3248129b73391ccbc..a29c31a43d6376d5f01c83272d764bd2a1a452cd 100644 (file)
@@ -497,6 +497,8 @@ PyObject_Bytes(PyObject *v)
             }
             return result;
        }
+       else if (PyErr_Occurred())
+               return NULL;
        return PyBytes_FromObject(v);
 }
 
index 6639acc7d104ec169725742c40b48ae28219d458..89613ecbc216f42a9b363f5f0ae6f20e46dea756 100644 (file)
@@ -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);