diff Python/compile.c @ 16398:80c0b280a4f9 legacy-trunk

Allow 'continue' inside 'try' clause SF patch 102989 by Thomas Wouters
author Jeremy Hylton <jeremy@alum.mit.edu>
date Thu, 01 Feb 2001 22:48:12 +0000
parents f700e6b8de1f
children ec709ee8e6fa
line wrap: on
line diff
--- a/Python/compile.c	Thu Feb 01 21:31:58 2001 +0000
+++ b/Python/compile.c	Thu Feb 01 22:48:12 2001 +0000
@@ -5,7 +5,7 @@
    XXX add __doc__ attribute == co_doc to code object attributes?
    XXX   (it's currently the first item of the co_const tuple)
    XXX Generate simple jump for break/return outside 'try...finally'
-   XXX Allow 'continue' inside try-finally
+   XXX Allow 'continue' inside finally clause of try-finally
    XXX New opcode for loading the initial index for a for loop
    XXX other JAR tricks?
 */
@@ -3247,19 +3247,24 @@
 	}
 	else {
 		int j;
-		for (j = 0; j <= i; ++j) {
+		for (j = i-1; j >= 0; --j) {
 			if (c->c_block[j] == SETUP_LOOP)
 				break;
 		}
-		if (j < i+1) {
+		if (j >= 0) {
 			/* there is a loop, but something interferes */
-			for (++j; j <= i; ++j) {
-				if (c->c_block[i] == SETUP_EXCEPT
-				    || c->c_block[i] == SETUP_FINALLY) {
-					com_error(c, PyExc_SyntaxError,
-			       "'continue' not supported inside 'try' clause");
+			for (; i > j; --i) {
+				if (c->c_block[i] == SETUP_EXCEPT ||
+				    c->c_block[i] == SETUP_FINALLY) {
+					com_addoparg(c, CONTINUE_LOOP,
+						     c->c_begin);
 					return;
 				}
+				if (c->c_block[i] == END_FINALLY) {
+					com_error(c, PyExc_SyntaxError,
+			  "'continue' not supported inside 'finally' clause");
+			  		return;
+			  	}
 			}
 		}
 		com_error(c, PyExc_SyntaxError,