From 181f980b6cc5dfa25b270e137c6d060a897b8bf4 Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Fri, 10 Nov 2017 21:53:12 +0900 Subject: Need to clear stack region for local variables in eval; fix #3844 --- src/vm.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/vm.c b/src/vm.c index 52eca83aa..38e2a9067 100644 --- a/src/vm.c +++ b/src/vm.c @@ -491,6 +491,7 @@ mrb_value mrb_exec_irep(mrb_state *mrb, mrb_value self, struct RProc *p) { mrb_callinfo *ci = mrb->c->ci; + int keep; mrb->c->stack[0] = self; ci->proc = p; @@ -499,7 +500,15 @@ mrb_exec_irep(mrb_state *mrb, mrb_value self, struct RProc *p) return p->body.func(mrb, self); } ci->nregs = p->body.irep->nregs; - stack_extend(mrb, (ci->argc < 0 && ci->nregs < 3) ? 3 : ci->nregs); + if (ci->argc < 0) keep = 3; + else keep = ci->argc + 1; + if (ci->argc < keep) { + stack_extend(mrb, keep); + } + else { + stack_extend(mrb, ci->argc); + stack_clear(mrb->c->stack+keep, ci->nregs-keep); + } ci = cipush(mrb); ci->nregs = 0; -- cgit v1.2.3