]> granicus.if.org Git - python/commitdiff
do not override errors from descriptors on modules
authorBenjamin Peterson <benjamin@python.org>
Thu, 24 Apr 2014 23:29:23 +0000 (19:29 -0400)
committerBenjamin Peterson <benjamin@python.org>
Thu, 24 Apr 2014 23:29:23 +0000 (19:29 -0400)
Lib/test/test_module.py
Objects/moduleobject.c

index 5a22e69a8efdba3adebc9e24e80fdcdbf90fc6a7..9da353633385ac53ca794402c5366386bb58f4af 100644 (file)
@@ -227,6 +227,14 @@ a = A(destroyed)"""
             b"len = len",
             b"shutil.rmtree = rmtree"})
 
+    def test_descriptor_errors_propogate(self):
+        class Descr:
+            def __get__(self, o, t):
+                raise RuntimeError
+        class M(ModuleType):
+            melon = Descr()
+        self.assertRaises(RuntimeError, getattr, M("mymod"), "melon")
+
     # frozen and namespace module reprs are tested in importlib.
 
 
index 522ee5e5e7088ba47f3b0d550d5a0d441a255588..a3d9557c4ec209555935c819707ec424e8a128e2 100644 (file)
@@ -412,24 +412,23 @@ module_repr(PyModuleObject *m)
 }
 
 static PyObject*
-module_getattr(PyObject *m, PyObject *name)
+module_getattro(PyModuleObject *m, PyObject *name)
 {
-    PyModuleObject *module;
     PyObject *attr, *mod_name;
-    attr = PyObject_GenericGetAttr(m, name);
-    if (attr != NULL)
+    attr = PyObject_GenericGetAttr((PyObject *)m, name);
+    if (attr || !PyErr_ExceptionMatches(PyExc_AttributeError))
         return attr;
     PyErr_Clear();
-    module = (PyModuleObject*)m;
-    if (module->md_dict != NULL) {
-        mod_name = PyDict_GetItemString(module->md_dict, "__name__");
-        if (mod_name != NULL) {
+    if (m->md_dict) {
+        mod_name = PyDict_GetItemString(m->md_dict, "__name__");
+        if (mod_name) {
             PyErr_Format(PyExc_AttributeError,
                         "module '%U' has no attribute '%U'", mod_name, name);
             return NULL;
         }
-        else if (PyErr_Occurred())
+        else if (PyErr_Occurred()) {
             PyErr_Clear();
+        }
     }
     PyErr_Format(PyExc_AttributeError,
                 "module has no attribute '%U'", name);
@@ -512,7 +511,7 @@ PyTypeObject PyModule_Type = {
     0,                                          /* tp_hash */
     0,                                          /* tp_call */
     0,                                          /* tp_str */
-    module_getattr,                             /* tp_getattro */
+    (getattrofunc)module_getattro,              /* tp_getattro */
     PyObject_GenericSetAttr,                    /* tp_setattro */
     0,                                          /* tp_as_buffer */
     Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |