]> granicus.if.org Git - python/commitdiff
Merged revisions 67666,67685 via svnmerge from
authorJeffrey Yasskin <jyasskin@gmail.com>
Thu, 11 Dec 2008 05:21:18 +0000 (05:21 +0000)
committerJeffrey Yasskin <jyasskin@gmail.com>
Thu, 11 Dec 2008 05:21:18 +0000 (05:21 +0000)
svn+ssh://pythondev@svn.python.org/python/trunk

........
  r67666 | jeffrey.yasskin | 2008-12-08 10:55:24 -0800 (Mon, 08 Dec 2008) | 3 lines

  Issue 4597: Fix several cases in EvalFrameEx where an exception could be
  "raised" without setting x, err, or why to let the eval loop know.
........
  r67685 | jeffrey.yasskin | 2008-12-09 23:35:02 -0800 (Tue, 09 Dec 2008) | 2 lines

  Update Misc/NEWS for r67666.
........

Lib/test/test_file.py
Misc/NEWS
Python/ceval.c

index b93bdbd9d0a5bd28c4b8e7ad64e945890d840c29..2d791a55c07f0df91f545cede9fff7c71440ca77 100644 (file)
@@ -531,6 +531,20 @@ class StdoutTests(unittest.TestCase):
         finally:
             sys.stdout = save_stdout
 
+    def test_del_stdout_before_print(self):
+        # Issue 4597: 'print' with no argument wasn't reporting when
+        # sys.stdout was deleted.
+        save_stdout = sys.stdout
+        del sys.stdout
+        try:
+            print
+        except RuntimeError as e:
+            self.assertEquals(str(e), "lost sys.stdout")
+        else:
+            self.fail("Expected RuntimeError")
+        finally:
+            sys.stdout = save_stdout
+
 
 def test_main():
     # Historically, these tests have been sloppy about removing TESTFN.
index f1bc34fc46e7d036f0286e1eba56d5c762959e54..4bf027cc975c6df935c6e1098cf47c43e9b97bb3 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -12,7 +12,10 @@ What's New in Python 2.6.2
 Core and Builtins
 -----------------
 
-- Issue #4597: Fixed exception handling when the __exit__ function of a
+- Issue #4597: Fixed several opcodes that weren't always propagating
+  exceptions.
+
+- Issue #4589: Fixed exception handling when the __exit__ function of a
   context manager returns a value that cannot be converted to a bool.
 
 - Issue #4233: Changed semantic of ``_fileio.FileIO``'s ``close()`` 
index dd1e171770f6dfb45e0d8c87221ab98a6a23446f..5bac65fd0dc743c2e70851b4c7a7149e4eccc44f 100644 (file)
@@ -1041,6 +1041,7 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag)
                        }
                        Py_FatalError("invalid argument to DUP_TOPX"
                                      " (bytecode corruption?)");
+                       /* Never returns, so don't bother to set why. */
                        break;
 
                case UNARY_POSITIVE:
@@ -1634,9 +1635,11 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag)
                case PRINT_NEWLINE:
                        if (stream == NULL || stream == Py_None) {
                                w = PySys_GetObject("stdout");
-                               if (w == NULL)
+                               if (w == NULL) {
                                        PyErr_SetString(PyExc_RuntimeError,
                                                        "lost sys.stdout");
+                                       why = WHY_EXCEPTION;
+                               }
                        }
                        if (w != NULL) {
                                /* w.write() may replace sys.stdout, so we
@@ -1862,6 +1865,7 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag)
                                PyErr_Format(PyExc_SystemError,
                                             "no locals when loading %s",
                                             PyObject_REPR(w));
+                               why = WHY_EXCEPTION;
                                break;
                        }
                        if (PyDict_CheckExact(v)) {
@@ -2458,7 +2462,10 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag)
                        Py_DECREF(v);
                        if (x != NULL) {
                                v = POP();
-                               err = PyFunction_SetClosure(x, v);
+                               if (PyFunction_SetClosure(x, v) != 0) {
+                                       /* Can't happen unless bytecode is corrupt. */
+                                       why = WHY_EXCEPTION;
+                               }
                                Py_DECREF(v);
                        }
                        if (x != NULL && oparg > 0) {
@@ -2472,7 +2479,11 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag)
                                        w = POP();
                                        PyTuple_SET_ITEM(v, oparg, w);
                                }
-                               err = PyFunction_SetDefaults(x, v);
+                               if (PyFunction_SetDefaults(x, v) != 0) {
+                                       /* Can't happen unless
+                                           PyFunction_SetDefaults changes. */
+                                       why = WHY_EXCEPTION;
+                               }
                                Py_DECREF(v);
                        }
                        PUSH(x);