diff Python/ceval.c @ 54904:2602b56ad02d

update comments
author Benjamin Peterson <benjamin@python.org>
date Sun, 28 Jun 2009 15:55:46 +0000
parents 544c5bad1607
children b55a78b39bd5
line wrap: on
line diff
--- a/Python/ceval.c	Sun Jun 28 15:40:50 2009 +0000
+++ b/Python/ceval.c	Sun Jun 28 15:55:46 2009 +0000
@@ -2491,20 +2491,23 @@
 			   - (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 @@
 				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--;