From 2f5f853111dd5d73cb7a85c5306aa1e41d3d7fc4 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Fri, 19 Oct 2012 23:17:49 +0900 Subject: shuld handle return in rescue; close #487 --- src/vm.c | 3 +++ 1 file changed, 3 insertions(+) (limited to 'src') diff --git a/src/vm.c b/src/vm.c index 7bf3af9d4..14efb38f8 100644 --- a/src/vm.c +++ b/src/vm.c @@ -1126,6 +1126,7 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) switch (GETARG_B(i)) { case OP_R_NORMAL: + NORMAL_RETURN: if (ci == mrb->cibase) { localjump_error(mrb, "return"); goto L_RAISE; @@ -1133,6 +1134,7 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) ci = mrb->ci; break; case OP_R_BREAK: + if (!proc->env) goto NORMAL_RETURN; if (proc->env->cioff < 0) { localjump_error(mrb, "break"); goto L_RAISE; @@ -1140,6 +1142,7 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) ci = mrb->ci = mrb->cibase + proc->env->cioff + 1; break; case OP_R_RETURN: + if (!proc->env) goto NORMAL_RETURN; if (proc->env->cioff < 0) { localjump_error(mrb, "return"); goto L_RAISE; -- cgit v1.2.3