]> granicus.if.org Git - python/commitdiff
use error label instead of breaking eval loop (closes #16693)
authorBenjamin Peterson <benjamin@python.org>
Sat, 15 Dec 2012 17:51:05 +0000 (12:51 -0500)
committerBenjamin Peterson <benjamin@python.org>
Sat, 15 Dec 2012 17:51:05 +0000 (12:51 -0500)
Lib/test/test_builtin.py
Python/ceval.c

index 19d7c7068d3c57c4b5cfe8f4d0117404714bb0df..2c5201e849377527d45bfbe9cce72e2fff629797 100644 (file)
@@ -462,6 +462,11 @@ class BuiltinTest(unittest.TestCase):
         self.assertRaises(TypeError, eval, ())
         self.assertRaises(SyntaxError, eval, bom[:2] + b'a')
 
+        class X:
+            def __getitem__(self, key):
+                raise ValueError
+        self.assertRaises(ValueError, eval, "foo", {}, X())
+
     def test_general_eval(self):
         # Tests that general mappings can be used for the locals argument
 
index 807fa7d2c3b613fe984a3027e6b8b1dcedc2c00d..32c203ecbcf030aaa73d5dd16de4c6eafe668404 100644 (file)
@@ -2162,9 +2162,8 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag)
             else {
                 v = PyObject_GetItem(locals, name);
                 if (v == NULL && PyErr_Occurred()) {
-                    if (!PyErr_ExceptionMatches(
-                                    PyExc_KeyError))
-                        break;
+                    if (!PyErr_ExceptionMatches(PyExc_KeyError))
+                        goto error;
                     PyErr_Clear();
                 }
             }