summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2017-08-09 12:25:20 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2017-08-09 12:25:20 +0900
commit8f629578882433bf290bcff14c18dadd545ad20b (patch)
treef96dc45110415c1f650541e3efba00f681cdf581
parent66e2928bd481a0dd2762da9428af39b3384c0852 (diff)
downloadmruby-8f629578882433bf290bcff14c18dadd545ad20b.tar.gz
mruby-8f629578882433bf290bcff14c18dadd545ad20b.zip
Support `break` within rescue clauses; fix #3767 ref #3721
-rw-r--r--mrbgems/mruby-compiler/core/codegen.c25
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;