Remove temporary limitation of `OP_EPOP`.
After the operand of `OP_EPOP` should have been `1`.
Now we have removed the limitation.
MODIFY
mrbgems/mruby-compiler/core/codegen.c
mrbgems/mruby-compiler/core/codegen.c
@@ -279,20 +279,10 @@ genop_peep(codegen_scope *s, mrb_code i, int val)
}
break;
case OP_EPOP:
-#if 1
- if (GETARG_A(i) > 1) {
- int j, len = GETARG_A(i), n;
- for (j=0; j<len; j++) {
- n = genop(s, MKOP_A(OP_EPOP, 1));
- }
- return n;
- }
-#else
if (c0 == OP_EPOP) {
s->iseq[s->pc-1] = MKOP_A(OP_EPOP, GETARG_A(i0)+GETARG_A(i));
return 0;
}
-#endif
break;
case OP_POPERR:
if (c0 == OP_POPERR) {

MODIFY
src/vm.c
src/vm.c
@@ -1319,18 +1319,17 @@ RETRY_TRY_BLOCK:
CASE(OP_EPOP) {
/* A A.times{ensure_pop().call} */
int a = GETARG_A(i);
+ int n, epos = mrb->c->ci->epos;
mrb_callinfo *ci;
mrb_value self = regs[0];
- mrb_assert(a==1); /* temporary limitation */
- if (mrb->c->eidx == mrb->c->ci->epos) {
+ if (mrb->c->eidx == epos) {
NEXT;
}
- proc = mrb->c->ensure[--mrb->c->eidx];
+ for (n=0; n<a && mrb->c->eidx > epos; n++) {
+ proc = mrb->c->ensure[epos+n];
irep = proc->body.irep;
- pool = irep->pool;
- syms = irep->syms;
ci = cipush(mrb);
ci->mid = ci[-1].mid;
ci->argc = 0;
@@ -1344,6 +1343,10 @@ RETRY_TRY_BLOCK:
stack_extend(mrb, ci->nregs);
regs[0] = self;
pc = irep->iseq;
+ }
+ pool = irep->pool;
+ syms = irep->syms;
+ mrb->c->eidx = epos;
JUMP;
}

Remove temporary limitation of `OP_EPOP`.

After f68f5f6, the operand of `OP_EPOP` should have been `1`.
Now we have removed the limitation.