diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2016-01-04 10:22:38 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2016-01-04 10:22:38 +0900 |
| commit | aec825a64c4618ee16a0243c933556648398bb76 (patch) | |
| tree | 961bdc58ed43386b59ec22c993514c9874ef62e2 | |
| parent | aa1f668b80617bca1cfa204d18404a883c04c927 (diff) | |
| download | mruby-aec825a64c4618ee16a0243c933556648398bb76.tar.gz mruby-aec825a64c4618ee16a0243c933556648398bb76.zip | |
stack_extend before eval_under()
| -rw-r--r-- | src/vm.c | 11 |
1 files changed, 10 insertions, 1 deletions
@@ -504,6 +504,7 @@ eval_under(mrb_state *mrb, mrb_value self, mrb_value blk, struct RClass *c) { struct RProc *p; mrb_callinfo *ci; + mrb_int max = 3; if (mrb_nil_p(blk)) { mrb_raise(mrb, E_ARGUMENT_ERROR, "no block given"); @@ -516,11 +517,19 @@ eval_under(mrb_state *mrb, mrb_value self, mrb_value blk, struct RClass *c) p = mrb_proc_ptr(blk); ci->proc = p; ci->argc = 1; - mrb->c->stack[1] = self; if (MRB_PROC_CFUNC_P(p)) { + stack_extend(mrb, 3, 0); + mrb->c->stack[0] = self; + mrb->c->stack[1] = self; + mrb->c->stack[2] = mrb_nil_value(); return p->body.func(mrb, self); } ci->nregs = p->body.irep->nregs; + if (max < ci->nregs) max = ci->nregs; + stack_extend(mrb, max, 0); + mrb->c->stack[0] = self; + mrb->c->stack[1] = self; + mrb->c->stack[2] = mrb_nil_value(); ci = cipush(mrb); ci->nregs = 0; ci->target_class = 0; |
