diff options
Diffstat (limited to 'Python/compile.c')
| -rw-r--r-- | Python/compile.c | 14 | 
1 files changed, 13 insertions, 1 deletions
diff --git a/Python/compile.c b/Python/compile.c index 76c4628..038bc2f 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -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.  */  | 
