Fix input() builtin function to respect compiler flags.

(SF patch 876178, patch by mwh, unittest by perky)
This commit is contained in:
Hye-Shik Chang 2004-02-02 13:39:01 +00:00
parent 96c44658b9
commit ff83c2bacc
3 changed files with 20 additions and 1 deletions

View File

@ -931,6 +931,19 @@ class BuiltinTest(unittest.TestCase):
self.assertEqual(input(), 'whitespace') self.assertEqual(input(), 'whitespace')
sys.stdin = cStringIO.StringIO() sys.stdin = cStringIO.StringIO()
self.assertRaises(EOFError, input) self.assertRaises(EOFError, input)
# SF 876178: make sure input() respect future options.
sys.stdin = cStringIO.StringIO('1/2')
sys.stdout = cStringIO.StringIO()
exec compile('print input()', 'test_builtin_tmp', 'exec')
sys.stdin.seek(0, 0)
exec compile('from __future__ import division;print input()',
'test_builtin_tmp', 'exec')
sys.stdin.seek(0, 0)
exec compile('print input()', 'test_builtin_tmp', 'exec')
self.assertEqual(sys.stdout.getvalue().splitlines(),
['0', '0.5', '0'])
del sys.stdout del sys.stdout
self.assertRaises(RuntimeError, input, 'prompt') self.assertRaises(RuntimeError, input, 'prompt')
del sys.stdin del sys.stdin

View File

@ -12,6 +12,9 @@ What's New in Python 2.4 alpha 1?
Core and builtins Core and builtins
----------------- -----------------
- input() builtin function now respects compiler flags such as
__future__ statements. SF patch 876178.
- Removed PendingDeprecationWarning from apply(). apply() remains - Removed PendingDeprecationWarning from apply(). apply() remains
deprecated, but the nuisance warning will not be issued. deprecated, but the nuisance warning will not be issued.

View File

@ -979,6 +979,7 @@ builtin_input(PyObject *self, PyObject *args)
char *str; char *str;
PyObject *res; PyObject *res;
PyObject *globals, *locals; PyObject *globals, *locals;
PyCompilerFlags cf;
line = builtin_raw_input(self, args); line = builtin_raw_input(self, args);
if (line == NULL) if (line == NULL)
@ -994,7 +995,9 @@ builtin_input(PyObject *self, PyObject *args)
PyEval_GetBuiltins()) != 0) PyEval_GetBuiltins()) != 0)
return NULL; return NULL;
} }
res = PyRun_String(str, Py_eval_input, globals, locals); cf.cf_flags = 0;
PyEval_MergeCompilerFlags(&cf);
res = PyRun_StringFlags(str, Py_eval_input, globals, locals, &cf);
Py_DECREF(line); Py_DECREF(line);
return res; return res;
} }