summaryrefslogtreecommitdiffhomepage
path: root/src/vm.c
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2017-11-10 21:53:12 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2017-11-10 21:53:12 +0900
commit181f980b6cc5dfa25b270e137c6d060a897b8bf4 (patch)
tree10c9689c867d16ccafa2108f75923bd9154b2ba6 /src/vm.c
parent41c8c419cf7d9cc220a39696e2e498881394352b (diff)
downloadmruby-181f980b6cc5dfa25b270e137c6d060a897b8bf4.tar.gz
mruby-181f980b6cc5dfa25b270e137c6d060a897b8bf4.zip
Need to clear stack region for local variables in eval; fix #3844
Diffstat (limited to 'src/vm.c')
-rw-r--r--src/vm.c11
1 files changed, 10 insertions, 1 deletions
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;