diff options
author | Amaury Forgeot d'Arc <amauryfa@gmail.com> | 2008-04-04 23:25:27 (GMT) |
---|---|---|
committer | Amaury Forgeot d'Arc <amauryfa@gmail.com> | 2008-04-04 23:25:27 (GMT) |
commit | 9ed77358d618e4c65fbe5df67a87618be29fc391 (patch) | |
tree | 20eff232a288142e83f20de808626c9c3c8fbeec /Python | |
parent | bff533b4798de3909b53dc2d14d9b074587c17ac (diff) | |
download | cpython-9ed77358d618e4c65fbe5df67a87618be29fc391.zip cpython-9ed77358d618e4c65fbe5df67a87618be29fc391.tar.gz cpython-9ed77358d618e4c65fbe5df67a87618be29fc391.tar.bz2 |
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...
Diffstat (limited to 'Python')
-rw-r--r-- | Python/pythonrun.c | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/Python/pythonrun.c b/Python/pythonrun.c index 74e3430..3207fb8 100644 --- a/Python/pythonrun.c +++ b/Python/pythonrun.c @@ -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 * |