diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/load.c | 4 | ||||
| -rw-r--r-- | src/vm.c | 18 |
2 files changed, 17 insertions, 5 deletions
diff --git a/src/load.c b/src/load.c index e2f74d504..3d7b54eef 100644 --- a/src/load.c +++ b/src/load.c @@ -510,7 +510,7 @@ mrb_load_irep(mrb_state *mrb, const uint8_t *bin) irep_error(mrb, n); return mrb_nil_value(); } - return mrb_run(mrb, mrb_proc_new(mrb, mrb->irep[n]), mrb_top_self(mrb)); + return mrb_context_run(mrb, mrb_proc_new(mrb, mrb->irep[n]), mrb_top_self(mrb)); } #ifdef ENABLE_STDIO @@ -760,6 +760,6 @@ mrb_load_irep_file(mrb_state *mrb, FILE* fp) irep_error(mrb, n); return mrb_nil_value(); } - return mrb_run(mrb, mrb_proc_new(mrb, mrb->irep[n]), mrb_top_self(mrb)); + return mrb_context_run(mrb, mrb_proc_new(mrb, mrb->irep[n]), mrb_top_self(mrb)); } #endif /* ENABLE_STDIO */ @@ -546,8 +546,8 @@ void mrb_gv_val_set(mrb_state *mrb, mrb_sym sym, mrb_value val); #define CALL_MAXARGS 127 -mrb_value -mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) +static mrb_value +run_proc(mrb_state *mrb, struct RProc *proc, mrb_value self, unsigned int stack_keep) { /* mrb_assert(mrb_proc_cfunc_p(proc)) */ mrb_irep *irep = proc->body.irep; @@ -595,7 +595,7 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) if (!mrb->c->stack) { stack_init(mrb); } - stack_extend(mrb, irep->nregs, mrb->c->ci->argc + 2); /* argc + 2 (receiver and block) */ + stack_extend(mrb, irep->nregs, stack_keep); mrb->c->ci->err = pc; mrb->c->ci->proc = proc; mrb->c->ci->nregs = irep->nregs + 1; @@ -2145,6 +2145,18 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) END_DISPATCH; } +mrb_value +mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) +{ + return run_proc(mrb, proc, self, mrb->c->ci->argc + 2); /* argc + 2 (receiver and block) */ +} + +mrb_value +mrb_context_run(mrb_state *mrb, struct RProc *proc, mrb_value self) +{ + return run_proc(mrb, proc, self, proc->body.irep->nregs); +} + void mrb_longjmp(mrb_state *mrb) { |
