From 9272279afdd5f102f0f1d4022da61265c5a46d04 Mon Sep 17 00:00:00 2001 From: Benjamin Peterson Date: Sat, 15 Dec 2012 12:51:05 -0500 Subject: use error label instead of breaking eval loop (closes #16693) --- Lib/test/test_builtin.py | 5 +++++ Python/ceval.c | 5 ++--- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/Lib/test/test_builtin.py b/Lib/test/test_builtin.py index 19d7c70..2c5201e 100644 --- a/Lib/test/test_builtin.py +++ b/Lib/test/test_builtin.py @@ -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 diff --git a/Python/ceval.c b/Python/ceval.c index 807fa7d..32c203e 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -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(); } } -- cgit v0.12