[Python-checkins] r52222 - in python/branches/release25-maint: Lib/test/test_syntax.py Misc/NEWS Python/compile.c
georg.brandl
python-checkins at python.org
Sun Oct 8 09:12:25 CEST 2006
Author: georg.brandl
Date: Sun Oct 8 09:12:23 2006
New Revision: 52222
Modified:
python/branches/release25-maint/Lib/test/test_syntax.py
python/branches/release25-maint/Misc/NEWS
python/branches/release25-maint/Python/compile.c
Log:
Fix #1569998: no break inside try statement (outside loop) allowed.
(backport from rev. 52129)
Modified: python/branches/release25-maint/Lib/test/test_syntax.py
==============================================================================
--- python/branches/release25-maint/Lib/test/test_syntax.py (original)
+++ python/branches/release25-maint/Lib/test/test_syntax.py Sun Oct 8 09:12:23 2006
@@ -319,6 +319,20 @@
...
SyntaxError: 'continue' not supported inside 'finally' clause (<doctest test.test_syntax[41]>, line 8)
+There is one test for a break that is not in a loop. The compiler
+uses a single data structure to keep track of try-finally and loops,
+so we need to be sure that a break is actually inside a loop. If it
+isn't, there should be a syntax error.
+
+ >>> try:
+ ... print 1
+ ... break
+ ... print 2
+ ... finally:
+ ... print 3
+ Traceback (most recent call last):
+ ...
+ SyntaxError: 'break' outside loop (<doctest test.test_syntax[42]>, line 3)
"""
import re
Modified: python/branches/release25-maint/Misc/NEWS
==============================================================================
--- python/branches/release25-maint/Misc/NEWS (original)
+++ python/branches/release25-maint/Misc/NEWS Sun Oct 8 09:12:23 2006
@@ -12,6 +12,9 @@
Core and builtins
-----------------
+- Bug #1569998: break inside a try statement (outside a loop) is now
+ recognized and rejected.
+
- Patch #1542451: disallow continue anywhere under a finally.
- list.pop(x) accepts any object x following the __index__ protocol.
Modified: python/branches/release25-maint/Python/compile.c
==============================================================================
--- python/branches/release25-maint/Python/compile.c (original)
+++ python/branches/release25-maint/Python/compile.c Sun Oct 8 09:12:23 2006
@@ -187,6 +187,8 @@
basicblock *);
static void compiler_pop_fblock(struct compiler *, enum fblocktype,
basicblock *);
+/* Returns true if there is a loop on the fblock stack. */
+static int compiler_in_loop(struct compiler *);
static int inplace_binop(struct compiler *, operator_ty);
static int expr_constant(expr_ty e);
@@ -2764,7 +2766,7 @@
case Pass_kind:
break;
case Break_kind:
- if (!c->u->u_nfblocks)
+ if (!compiler_in_loop(c))
return compiler_error(c, "'break' outside loop");
ADDOP(c, BREAK_LOOP);
break;
@@ -3754,6 +3756,16 @@
assert(u->u_fblock[u->u_nfblocks].fb_block == b);
}
+static int
+compiler_in_loop(struct compiler *c) {
+ int i;
+ struct compiler_unit *u = c->u;
+ for (i = 0; i < u->u_nfblocks; ++i) {
+ if (u->u_fblock[i].fb_type == LOOP)
+ return 1;
+ }
+ return 0;
+}
/* Raises a SyntaxError and returns 0.
If something goes wrong, a different exception may be raised.
*/
More information about the Python-checkins
mailing list