Skip to content

Commit b979226

Browse files
committed
Clear stack in OP_CALL; fix #3694
1 parent 7830b84 commit b979226

File tree

1 file changed

+7
-5
lines changed

1 file changed

+7
-5
lines changed

src/vm.c

+7-5
Original file line numberDiff line numberDiff line change
@@ -856,9 +856,7 @@ mrb_vm_run(mrb_state *mrb, struct RProc *proc, mrb_value self, unsigned int stac
856856
if (stack_keep > nregs)
857857
nregs = stack_keep;
858858
stack_extend(mrb, nregs);
859-
if (nregs > stack_keep) {
860-
stack_clear(c->stack + stack_keep, nregs - stack_keep);
861-
}
859+
stack_clear(c->stack + stack_keep, nregs - stack_keep);
862860
c->stack[0] = self;
863861
result = mrb_vm_exec(mrb, proc, irep->iseq);
864862
if (c->ci - c->cibase > cioff) {
@@ -1437,10 +1435,14 @@ mrb_vm_exec(mrb_state *mrb, struct RProc *proc, mrb_code *pc)
14371435
syms = irep->syms;
14381436
ci->nregs = irep->nregs;
14391437
if (ci->argc < 0) {
1440-
stack_extend(mrb, (irep->nregs < 3) ? 3 : irep->nregs);
1438+
if (irep->nregs > 3) {
1439+
stack_extend(mrb, irep->nregs);
1440+
stack_clear(regs+3, irep->nregs-3);
1441+
}
14411442
}
1442-
else {
1443+
else if (ci->argc+2 < irep->nregs) {
14431444
stack_extend(mrb, irep->nregs);
1445+
stack_clear(regs+ci->argc+2, irep->nregs-ci->argc-2);
14441446
}
14451447
if (m->env) {
14461448
regs[0] = m->env->stack[0];

0 commit comments

Comments
 (0)