]> granicus.if.org Git - python/commitdiff
correctly rearrange the stack in the exception case of WITH_CLEANUP
authorBenjamin Peterson <benjamin@python.org>
Sun, 28 Jun 2009 15:40:50 +0000 (15:40 +0000)
committerBenjamin Peterson <benjamin@python.org>
Sun, 28 Jun 2009 15:40:50 +0000 (15:40 +0000)
Python/ceval.c

index b689f3de28bb4e9f4f7720dbff7bc0fd69e9b593..24e41689ade9681cbe44cd000b1d13bde9dfeaf3 100644 (file)
@@ -2533,10 +2533,21 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag)
                                u = v = w = Py_None;
                        }
                        else {
+                               PyObject *tp, *exc, *tb;
+                               PyTryBlock *block;
                                v = SECOND();
                                w = THIRD();
+                               tp = FOURTH();
+                               exc = stack_pointer[-5];
+                               tb = stack_pointer[-6];
                                exit_func = stack_pointer[-7];
-                               stack_pointer[-7] = NULL;
+                               stack_pointer[-7] = tb;
+                               stack_pointer[-6] = exc;
+                               stack_pointer[-5] = tp;
+                               FOURTH() = NULL;
+                               block = &f->f_blockstack[f->f_iblock - 1];
+                               assert(block->b_type == EXCEPT_HANDLER);
+                               block->b_level--;
                        }
                        /* XXX Not the fastest way to call it... */
                        x = PyObject_CallFunctionObjArgs(exit_func, u, v, w,