]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Merged revisions 67697 via svnmerge from
authorJeffrey Yasskin <jyasskin@gmail.com>
Thu, 11 Dec 2008 06:36:25 +0000 (06:36 +0000)
committerJeffrey Yasskin <jyasskin@gmail.com>
Thu, 11 Dec 2008 06:36:25 +0000 (06:36 +0000)
svn+ssh://pythondev@svn.python.org/python/branches/py3k

................
  r67697 | jeffrey.yasskin | 2008-12-10 22:18:33 -0800 (Wed, 10 Dec 2008) | 14 lines

  Merged revisions 67666,67685 via svnmerge from
  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.
  ........
................

Misc/NEWS
Python/ceval.c

index 3dbd1eea2bf92e47fa486019039d38b50c5418b5..e1f31cc9abf6450210331ca75a1ab62b0eae7fb5 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -12,7 +12,10 @@ What's New in Python 3.0.1?
 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 #4533: File read operation was dreadfully slow due to a slowly
index f58a55d7baf4225140228335e72ef9d5293db4ef..c423c9f097c892a02c12e5179093e363b2bf0051 100644 (file)
@@ -1112,6 +1112,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:
@@ -1728,6 +1729,7 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag)
                        if ((v = f->f_locals) == NULL) {
                                PyErr_Format(PyExc_SystemError,
                                             "no locals when loading %R", w);
+                               why = WHY_EXCEPTION;
                                break;
                        }
                        if (PyDict_CheckExact(v)) {
@@ -2279,7 +2281,10 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag)
 
                        if (x != NULL && opcode == MAKE_CLOSURE) {
                                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);
                        }
 
@@ -2303,7 +2308,11 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag)
                                        Py_DECREF(w);
                                }
 
-                               err = PyFunction_SetAnnotations(x, v);
+                               if (PyFunction_SetAnnotations(x, v) != 0) {
+                                       /* Can't happen unless
+                                          PyFunction_SetAnnotations changes. */
+                                       why = WHY_EXCEPTION;
+                               }
                                Py_DECREF(v);
                                Py_DECREF(u);
                        }
@@ -2320,7 +2329,11 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag)
                                        w = POP();
                                        PyTuple_SET_ITEM(v, posdefaults, 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);
                        }
                        if (x != NULL && kwdefaults > 0) {
@@ -2338,7 +2351,11 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag)
                                        Py_DECREF(w);
                                        Py_DECREF(u);
                                }
-                               err = PyFunction_SetKwDefaults(x, v);
+                               if (PyFunction_SetKwDefaults(x, v) != 0) {
+                                       /* Can't happen unless
+                                           PyFunction_SetKwDefaults changes. */
+                                       why = WHY_EXCEPTION;
+                               }
                                Py_DECREF(v);
                        }
                        PUSH(x);