]> granicus.if.org Git - python/commitdiff
handle errors from _PyObject_LookupSpecial when __get__ fails
authorBenjamin Peterson <benjamin@python.org>
Mon, 25 May 2009 02:40:21 +0000 (02:40 +0000)
committerBenjamin Peterson <benjamin@python.org>
Mon, 25 May 2009 02:40:21 +0000 (02:40 +0000)
Lib/test/test_descr.py
Objects/abstract.c
Objects/enumobject.c
Objects/object.c
Python/sysmodule.c

index f3c216a39cc7d081bfe2f8acc2ccf881361474ed..c7989b11362d48d024084ae4a7e54909bdb88cbb 100644 (file)
@@ -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
index 63b20416faf84fc5b0f439a75b86d63d7bb22609..5eb7b28facffef784c292b03bffe6e8be97fb6d3 100644 (file)
@@ -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)
-               return defaultvalue;
+       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);
 }
index 65d46334cf81c7c36d6e61810cbe2a3377022438..0dc4eefd94fd4561caaa24882d5d6720cfc58e22 100644 (file)
@@ -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);
index 08abe71cca5ce52fb150b48ef9edbb38676e294e..95072afc6e45b0844b3aae0e336acaa051ae77cb 100644 (file)
@@ -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__ */
index 1146746873d48f00045a6a113fc377c777e1c21a..6eb6b626763669c2e03805a29c2cc1fc5049727a 100644 (file)
@@ -669,10 +669,12 @@ sys_getsizeof(PyObject *self, PyObject *args, PyObject *kwds)
        else {
                PyObject *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);