diff Python/ceval.c @ 24915:01e1d6abc501 legacy-trunk

My patch #597221. Use f_lasti more consistently.
author Michael W. Hudson <mwh@python.net>
date Tue, 20 Aug 2002 15:19:14 +0000
parents 2cdf3d0dfabd
children e3d96e00dc6c
line wrap: on
line diff
--- a/Python/ceval.c	Tue Aug 20 14:51:34 2002 +0000
+++ b/Python/ceval.c	Tue Aug 20 15:19:14 2002 +0000
@@ -599,12 +599,15 @@
 	fastlocals = f->f_localsplus;
 	freevars = f->f_localsplus + f->f_nlocals;
 	_PyCode_GETCODEPTR(co, &first_instr);
-	if (f->f_lasti < 0) {
-		next_instr = first_instr;
-	}
-	else {
-		next_instr = first_instr + f->f_lasti;
-	}
+	/* An explanation is in order for the next line.
+
+	   f->f_lasti now refers to the index of the last instruction
+	   executed.  You might think this was obvious from the name, but
+	   this wasn't always true before 2.3!  PyFrame_New now sets
+	   f->f_lasti to -1 (i.e. the index *before* the first instruction
+	   and YIELD_VALUE doesn't fiddle with f_lasti any more.  So this
+	   does work.  Promise. */
+	next_instr = first_instr + f->f_lasti + 1;
 	stack_pointer = f->f_stacktop;
 	assert(stack_pointer != NULL);
 	f->f_stacktop = NULL;	/* remains NULL unless yield suspends frame */
@@ -1521,9 +1524,6 @@
 		case YIELD_VALUE:
 			retval = POP();
 			f->f_stacktop = stack_pointer;
-			/* abuse the lasti field: here it points to 
-			   the *next* instruction */
-			f->f_lasti = INSTR_OFFSET();
 			why = WHY_YIELD;
 			break;