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...
This commit is contained in:
Amaury Forgeot d'Arc 2008-04-04 23:25:27 +00:00
parent bff533b479
commit 9ed77358d6
2 changed files with 18 additions and 0 deletions

View File

@ -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])

View File

@ -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 *