diff options
author | Tim Peters <tim.peters@gmail.com> | 2001-08-17 23:04:59 (GMT) |
---|---|---|
committer | Tim Peters <tim.peters@gmail.com> | 2001-08-17 23:04:59 (GMT) |
commit | 9fa96bed6fcad0faae778cf160f3415de560d08a (patch) | |
tree | aa80cf325883be4cbe0ee50d6bc54a3115cdf003 | |
parent | a8278cc37ef6557fa124a52811d79f6ba1cf328b (diff) | |
download | cpython-9fa96bed6fcad0faae778cf160f3415de560d08a.zip cpython-9fa96bed6fcad0faae778cf160f3415de560d08a.tar.gz cpython-9fa96bed6fcad0faae778cf160f3415de560d08a.tar.bz2 |
Fix for bug [#452230] future division isn't propagated.
builtin_eval wasn't merging in the compiler flags from the current frame;
I suppose we never noticed this before because future division is the
first future-feature that can affect expressions (nested_scopes and
generators had only statement-level effects).
-rw-r--r-- | Lib/test/test_binop.py | 1 | ||||
-rw-r--r-- | Python/bltinmodule.c | 9 |
2 files changed, 9 insertions, 1 deletions
diff --git a/Lib/test/test_binop.py b/Lib/test/test_binop.py index fc7ed94e5..2ca84f4 100644 --- a/Lib/test/test_binop.py +++ b/Lib/test/test_binop.py @@ -335,6 +335,7 @@ self.assertEqual(Rat(10, 3) / 3, Rat(10, 9)) self.assertEqual(2 / Rat(5), Rat(2, 5)) self.assertEqual(3.0 * Rat(1, 2), 1.5) self.assertEqual(Rat(1, 2) * 3.0, 1.5) +self.assertEqual(eval('1/2'), 0.5) """ test_support.run_unittest(RatTestCase) diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c index 9a179a1..9a6f5e4 100644 --- a/Python/bltinmodule.c +++ b/Python/bltinmodule.c @@ -523,6 +523,7 @@ builtin_eval(PyObject *self, PyObject *args) PyObject *cmd; PyObject *globals = Py_None, *locals = Py_None; char *str; + PyCompilerFlags cf; if (!PyArg_ParseTuple(args, "O|O!O!:eval", &cmd, @@ -536,11 +537,13 @@ builtin_eval(PyObject *self, PyObject *args) } else if (locals == Py_None) locals = globals; + if (PyDict_GetItemString(globals, "__builtins__") == NULL) { if (PyDict_SetItemString(globals, "__builtins__", PyEval_GetBuiltins()) != 0) return NULL; } + if (PyCode_Check(cmd)) { if (PyTuple_GET_SIZE(((PyCodeObject *)cmd)->co_freevars) > 0) { PyErr_SetString(PyExc_TypeError, @@ -549,6 +552,7 @@ builtin_eval(PyObject *self, PyObject *args) } return PyEval_EvalCode((PyCodeObject *) cmd, globals, locals); } + if (!PyString_Check(cmd) && !PyUnicode_Check(cmd)) { PyErr_SetString(PyExc_TypeError, @@ -559,7 +563,10 @@ builtin_eval(PyObject *self, PyObject *args) return NULL; while (*str == ' ' || *str == '\t') str++; - return PyRun_String(str, Py_eval_input, globals, locals); + + cf.cf_flags = 0; + (void)PyEval_MergeCompilerFlags(&cf); + return PyRun_StringFlags(str, Py_eval_input, globals, locals, &cf); } static char eval_doc[] = |