From fec42da1aba1105468593dd5e07ff3b06758848a Mon Sep 17 00:00:00 2001 From: Benjamin Peterson Date: Sun, 28 Jun 2009 15:55:46 +0000 Subject: [PATCH] update comments --- Python/ceval.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/Python/ceval.c b/Python/ceval.c index 24e41689ade..a42a66559b8 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -2491,20 +2491,23 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag) - (TOP, SECOND) = (WHY_{RETURN,CONTINUE}), retval - TOP = WHY_*; no retval below it - (TOP, SECOND, THIRD) = exc_info() + (FOURTH, FITH, SIXTH) = previous exception for EXCEPT_HANDLER Below them is EXIT, the context.__exit__ bound method. In the last case, we must call EXIT(TOP, SECOND, THIRD) otherwise we must call EXIT(None, None, None) - In all cases, we remove EXIT from the stack, leaving - the rest in the same order. + In the first two cases, we remove EXIT from the + stack, leaving the rest in the same order. In the + third case, we shift the bottom 3 values of the + stack down, and replace the empty spot with NULL. In addition, if the stack represents an exception, *and* the function call returns a 'true' value, we - "zap" this information, to prevent END_FINALLY from - re-raising the exception. (But non-local gotos - should still be resumed.) + push WHY_SILENCED onto the stack. END_FINALLY will + then not re-raise the exception. (But non-local + gotos should still be resumed.) */ PyObject *exit_func; @@ -2544,7 +2547,11 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag) stack_pointer[-7] = tb; stack_pointer[-6] = exc; stack_pointer[-5] = tp; + /* UNWIND_EXCEPT_BLOCK will pop this off. */ FOURTH() = NULL; + /* We just shifted the stack down, so we have + to tell the except handler block that the + values are lower than it expects. */ block = &f->f_blockstack[f->f_iblock - 1]; assert(block->b_type == EXCEPT_HANDLER); block->b_level--;