summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorYukihiro Matsumoto <[email protected]>2012-10-19 23:17:49 +0900
committerYukihiro Matsumoto <[email protected]>2012-10-19 23:17:49 +0900
commit2f5f853111dd5d73cb7a85c5306aa1e41d3d7fc4 (patch)
treeea8149706bf440e6284191724c14ffb9bb923a95 /src
parent651e8b7e9c513cda100d88216d54ceeb93234f65 (diff)
downloadmruby-2f5f853111dd5d73cb7a85c5306aa1e41d3d7fc4.tar.gz
mruby-2f5f853111dd5d73cb7a85c5306aa1e41d3d7fc4.zip
shuld handle return in rescue; close #487
Diffstat (limited to 'src')
-rw-r--r--src/vm.c3
1 files changed, 3 insertions, 0 deletions
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;