summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2017-09-12 12:41:02 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2017-09-12 12:41:02 +0900
commit5760226e71e2dbf87d31d8aad2d0cdaa0a18748a (patch)
tree2a9bf86d1468d86a9dd99d4bc4855f1f83a7cdff
parentd6e41c3e512673dac91906416a9c4543bbb2ab19 (diff)
downloadmruby-5760226e71e2dbf87d31d8aad2d0cdaa0a18748a.tar.gz
mruby-5760226e71e2dbf87d31d8aad2d0cdaa0a18748a.zip
Remove temporary limitation of `OP_EPOP`.
After f68f5f6, the operand of `OP_EPOP` should have been `1`. Now we have removed the limitation.
-rw-r--r--mrbgems/mruby-compiler/core/codegen.c10
-rw-r--r--src/vm.c37
2 files changed, 20 insertions, 27 deletions
diff --git a/mrbgems/mruby-compiler/core/codegen.c b/mrbgems/mruby-compiler/core/codegen.c
index 5bb0545c4..8f15a9b18 100644
--- a/mrbgems/mruby-compiler/core/codegen.c
+++ b/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) {
diff --git a/src/vm.c b/src/vm.c
index b8b2c5eca..941105212 100644
--- a/src/vm.c
+++ b/src/vm.c
@@ -1319,31 +1319,34 @@ 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];
- irep = proc->body.irep;
+ for (n=0; n<a && mrb->c->eidx > epos; n++) {
+ proc = mrb->c->ensure[epos+n];
+ irep = proc->body.irep;
+ ci = cipush(mrb);
+ ci->mid = ci[-1].mid;
+ ci->argc = 0;
+ ci->proc = proc;
+ ci->stackent = mrb->c->stack;
+ ci->nregs = irep->nregs;
+ ci->target_class = proc->target_class;
+ ci->pc = pc + 1;
+ ci->acc = ci[-1].nregs;
+ mrb->c->stack += ci->acc;
+ stack_extend(mrb, ci->nregs);
+ regs[0] = self;
+ pc = irep->iseq;
+ }
pool = irep->pool;
syms = irep->syms;
- ci = cipush(mrb);
- ci->mid = ci[-1].mid;
- ci->argc = 0;
- ci->proc = proc;
- ci->stackent = mrb->c->stack;
- ci->nregs = irep->nregs;
- ci->target_class = proc->target_class;
- ci->pc = pc + 1;
- ci->acc = ci[-1].nregs;
- mrb->c->stack += ci->acc;
- stack_extend(mrb, ci->nregs);
- regs[0] = self;
- pc = irep->iseq;
+ mrb->c->eidx = epos;
JUMP;
}