]> granicus.if.org Git - python/commitdiff
Merged revisions 67666,67685 via svnmerge from
authorJeffrey Yasskin <jyasskin@gmail.com>
Thu, 11 Dec 2008 06:18:33 +0000 (06:18 +0000)
committerJeffrey Yasskin <jyasskin@gmail.com>
Thu, 11 Dec 2008 06:18:33 +0000 (06:18 +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.
........

Misc/NEWS
Python/ceval.c

index eadf9c650e5db58edb9c4801ff2567ef2f6ca558..8495448a9f2a0f28df6ab9d7d15ad7145b645601 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -12,7 +12,10 @@ What's New in Python 3.1 alpha 0
 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 #4445: Replace "sizeof(PyBytesObject)" with
index 84d18b3a3cb10011633b549c141a3fe9c4458ed2..b17d3dbc76943114185c59e6f09818c8f7195c3f 100644 (file)
@@ -1120,6 +1120,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:
@@ -1736,6 +1737,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)) {
@@ -2287,7 +2289,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);
                        }
 
@@ -2311,7 +2316,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);
                        }
@@ -2328,7 +2337,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) {
@@ -2346,7 +2359,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);