Commit 9ed77358 authored by Amaury Forgeot d'Arc's avatar Amaury Forgeot d'Arc

Issue2221: in Idle, exec('xx') raised a SystemError('error return without exception set')

instead of the expected NameError

This happens when sys.stdout is redirected to something that cannot flush().
the flush_io() function must be exception-neutral: don't raise, and don't clear exceptions.

Next step: exec() is not supposed to flush sys.stdout...
parent bff533b4
......@@ -448,6 +448,17 @@ class BuiltinTest(unittest.TestCase):
del l['__builtins__']
self.assertEqual((g, l), ({'a': 1}, {'b': 2}))
def test_exec_redirected(self):
savestdout = sys.stdout
sys.stdout = None # Whatever that cannot flush()
try:
# Used to raise SystemError('error return without exception set')
exec('a')
except NameError:
pass
finally:
sys.stdout = savestdout
def test_filter(self):
self.assertEqual(list(filter(lambda c: 'a' <= c <= 'z', 'Hello World')), list('elloorld'))
self.assertEqual(list(filter(None, [1, 'hello', [], [3], '', None, 9, 0])), [1, 'hello', [3], 9])
......
......@@ -1467,6 +1467,11 @@ static void
flush_io(void)
{
PyObject *f, *r;
PyObject *type, *value, *traceback;
/* Save the current exception */
PyErr_Fetch(&type, &value, &traceback);
f = PySys_GetObject("stderr");
if (f != NULL) {
r = PyObject_CallMethod(f, "flush", "");
......@@ -1483,6 +1488,8 @@ flush_io(void)
else
PyErr_Clear();
}
PyErr_Restore(type, value, traceback);
}
static PyObject *
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment