diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2017-08-09 12:25:20 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2017-08-09 12:25:20 +0900 |
| commit | 8f629578882433bf290bcff14c18dadd545ad20b (patch) | |
| tree | f96dc45110415c1f650541e3efba00f681cdf581 | |
| parent | 66e2928bd481a0dd2762da9428af39b3384c0852 (diff) | |
| download | mruby-8f629578882433bf290bcff14c18dadd545ad20b.tar.gz mruby-8f629578882433bf290bcff14c18dadd545ad20b.zip | |
Support `break` within rescue clauses; fix #3767 ref #3721
| -rw-r--r-- | mrbgems/mruby-compiler/core/codegen.c | 25 |
1 files changed, 16 insertions, 9 deletions
diff --git a/mrbgems/mruby-compiler/core/codegen.c b/mrbgems/mruby-compiler/core/codegen.c index a1045c38c..fd49aa177 100644 --- a/mrbgems/mruby-compiler/core/codegen.c +++ b/mrbgems/mruby-compiler/core/codegen.c @@ -2120,9 +2120,7 @@ codegen(codegen_scope *s, node *tree, int val) } else { if (n > 0) { - while (n--) { - genop_peep(s, MKOP_A(OP_POPERR, 1), NOVAL); - } + genop_peep(s, MKOP_A(OP_POPERR, n), NOVAL); } if (s->ensure_level > lp->ensure_level) { genop_peep(s, MKOP_A(OP_EPOP, s->ensure_level - lp->ensure_level), NOVAL); @@ -2938,23 +2936,32 @@ loop_break(codegen_scope *s, node *tree) } else { struct loopinfo *loop; + int n = 0; if (tree) { gen_retval(s, tree); } loop = s->loop; - while (loop && loop->type == LOOP_BEGIN) { - genop_peep(s, MKOP_A(OP_POPERR, 1), NOVAL); - loop = loop->prev; - } - while (loop && (loop->type == LOOP_RESCUE || loop->type == LOOP_BEGIN)) { - loop = loop->prev; + while (loop) { + if (loop->type == LOOP_BEGIN) { + n++; + loop = loop->prev; + } + else if (loop->type == LOOP_RESCUE) { + loop = loop->prev; + } + else{ + break; + } } if (!loop) { raise_error(s, "unexpected break"); return; } + if (n > 0) { + genop_peep(s, MKOP_A(OP_POPERR, n), NOVAL); + } if (loop->type == LOOP_NORMAL) { int tmp; |
