Fix for bug [#452230] future division isn't propagated.
authorTim Peters <tim.peters@gmail.com>
Fri, 17 Aug 2001 23:04:59 +0000 (23:04 +0000)
committerTim Peters <tim.peters@gmail.com>
Fri, 17 Aug 2001 23:04:59 +0000 (23:04 +0000)
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).

Lib/test/test_binop.py
Python/bltinmodule.c

index fc7ed94e5a2d8f02f977cc8dce6535755bcde29d..2ca84f47d7232ad960368a347452a0a6271f0dd2 100644 (file)
@@ -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)
index 9a179a1780beb36671bfe4ec1d5b555d4075c769..9a6f5e411a475535ed1aca2f2383b5e2d37f0859 100644 (file)
@@ -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[] =