summaryrefslogtreecommitdiffhomepage
path: root/src/vm.c
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2014-03-26 01:09:09 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2014-03-26 01:09:09 +0900
commitbfd2a539edab8ef7935a75de8a6885d74ff9e8ef (patch)
treefce8fd6d21b944d892fc9a9e718f6afd16a79a7d /src/vm.c
parentb042b951ce4003f00dc33cdac1c9d422e1a21d55 (diff)
downloadmruby-bfd2a539edab8ef7935a75de8a6885d74ff9e8ef.tar.gz
mruby-bfd2a539edab8ef7935a75de8a6885d74ff9e8ef.zip
add new function mrb_toplevel_run to prevent running through C function boudaries on exceptions; close #1942
Diffstat (limited to 'src/vm.c')
-rw-r--r--src/vm.c17
1 files changed, 17 insertions, 0 deletions
diff --git a/src/vm.c b/src/vm.c
index 8504cc34c..505f3f955 100644
--- a/src/vm.c
+++ b/src/vm.c
@@ -2270,3 +2270,20 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self)
{
return mrb_context_run(mrb, proc, self, mrb->c->ci->argc + 2); /* argc + 2 (receiver and block) */
}
+
+mrb_value
+mrb_toplevel_run(mrb_state *mrb, struct RProc *proc)
+{
+ mrb_callinfo *ci;
+ mrb_value v;
+
+ if (!mrb->c->cibase || mrb->c->ci == mrb->c->cibase) {
+ return mrb_context_run(mrb, proc, mrb_top_self(mrb), 0);
+ }
+ ci = cipush(mrb);
+ ci->acc = CI_ACC_SKIP;
+ v = mrb_context_run(mrb, proc, mrb_top_self(mrb), 0);
+ cipop(mrb);
+
+ return v;
+}