mirror of
https://github.com/python/cpython.git
synced 2025-07-28 13:44:43 +00:00
Fix for SF bug 1569998: break permitted inside try.
The compiler was checking that there was something on the fblock stack, but not that there was a loop on the stack. Fixed that and added a test for the specific syntax error. Bug fix candidate.
This commit is contained in:
parent
1e3c3b15df
commit
82271f13e7
2 changed files with 27 additions and 1 deletions
|
@ -187,6 +187,8 @@ static int compiler_push_fblock(struct compiler *, enum fblocktype,
|
|||
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);
|
||||
|
@ -2157,7 +2159,7 @@ compiler_visit_stmt(struct compiler *c, stmt_ty s)
|
|||
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;
|
||||
|
@ -3147,6 +3149,16 @@ compiler_pop_fblock(struct compiler *c, enum fblocktype t, basicblock *b)
|
|||
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.
|
||||
*/
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue