summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTim Peters <tim.peters@gmail.com>2001-08-17 23:04:59 (GMT)
committerTim Peters <tim.peters@gmail.com>2001-08-17 23:04:59 (GMT)
commit9fa96bed6fcad0faae778cf160f3415de560d08a (patch)
treeaa80cf325883be4cbe0ee50d6bc54a3115cdf003
parenta8278cc37ef6557fa124a52811d79f6ba1cf328b (diff)
downloadcpython-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.py1
-rw-r--r--Python/bltinmodule.c9
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[] =