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:
parent
bff533b479
commit
9ed77358d6
|
@ -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 *
|
||||
|
|
Loading…
Reference in New Issue