summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBenjamin Peterson <benjamin@python.org>2012-12-15 17:51:05 (GMT)
committerBenjamin Peterson <benjamin@python.org>2012-12-15 17:51:05 (GMT)
commit9272279afdd5f102f0f1d4022da61265c5a46d04 (patch)
treecd57cf8ec8bd226b324fa3406f3e6fbf1722d1c4
parent1a714750cfdd3e71a1b43ff0e34305038713e356 (diff)
downloadcpython-9272279afdd5f102f0f1d4022da61265c5a46d04.zip
cpython-9272279afdd5f102f0f1d4022da61265c5a46d04.tar.gz
cpython-9272279afdd5f102f0f1d4022da61265c5a46d04.tar.bz2
use error label instead of breaking eval loop (closes #16693)
-rw-r--r--Lib/test/test_builtin.py5
-rw-r--r--Python/ceval.c5
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();
}
}