mirror of
https://github.com/python/cpython.git
synced 2025-08-20 00:32:12 +00:00
Fix #1569998: no break inside try statement (outside loop) allowed.
(backport from rev. 52129)
This commit is contained in:
parent
74284b9606
commit
a5fe3ef8d8
3 changed files with 30 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);
|
||||
|
@ -2764,7 +2766,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;
|
||||
|
@ -3754,6 +3756,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