summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2016-01-04 10:22:38 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2016-01-04 10:22:38 +0900
commitaec825a64c4618ee16a0243c933556648398bb76 (patch)
tree961bdc58ed43386b59ec22c993514c9874ef62e2
parentaa1f668b80617bca1cfa204d18404a883c04c927 (diff)
downloadmruby-aec825a64c4618ee16a0243c933556648398bb76.tar.gz
mruby-aec825a64c4618ee16a0243c933556648398bb76.zip
stack_extend before eval_under()
-rw-r--r--src/vm.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/src/vm.c b/src/vm.c
index 654555f3d..98f7c96c8 100644
--- a/src/vm.c
+++ b/src/vm.c
@@ -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;