diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2014-03-26 01:09:09 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2014-03-26 01:09:09 +0900 |
| commit | bfd2a539edab8ef7935a75de8a6885d74ff9e8ef (patch) | |
| tree | fce8fd6d21b944d892fc9a9e718f6afd16a79a7d /src/vm.c | |
| parent | b042b951ce4003f00dc33cdac1c9d422e1a21d55 (diff) | |
| download | mruby-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.c | 17 |
1 files changed, 17 insertions, 0 deletions
@@ -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; +} |
