Author: Armin Rigo <ar...@tunes.org>
Branch: 
Changeset: r94805:6ee028a07651
Date: 2018-07-05 17:01 +0200
http://bitbucket.org/pypy/pypy/changeset/6ee028a07651/

Log:    Issue #2837

        Write an end-of-line and flush stdout when an exception is about to
        be printed in code.py. Needed to emulate CPython's interactive
        command line behaviour more closely, and good to avoid strange
        effects.

diff --git a/lib-python/2.7/code.py b/lib-python/2.7/code.py
--- a/lib-python/2.7/code.py
+++ b/lib-python/2.7/code.py
@@ -104,6 +104,12 @@
         except SystemExit:
             raise
         except:
+            if softspace(sys.stdout, 0):
+                print
+            try:
+                sys.stdout.flush()
+            except:
+                pass
             self.showtraceback()
         else:
             if softspace(sys.stdout, 0):
diff --git a/pypy/module/test_lib_pypy/test_code_extra.py 
b/pypy/module/test_lib_pypy/test_code_extra.py
new file mode 100644
--- /dev/null
+++ b/pypy/module/test_lib_pypy/test_code_extra.py
@@ -0,0 +1,19 @@
+import py
+import sys
+import cStringIO
+import code
+
+
+def test_flush_stdout_on_error():
+    runner = code.InteractiveInterpreter()
+    old_stdout = sys.stdout
+    try:
+        mystdout = cStringIO.StringIO()
+        sys.stdout = mystdout
+        runner.runcode(compile("print 5,;0/0", "<interactive>", "exec"))
+    finally:
+        sys.stdout = old_stdout
+
+    if '__pypy__' not in sys.builtin_module_names:
+        py.test.skip('pypy only test')
+    assert mystdout.getvalue() == "5\n"
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to