diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2017-09-12 12:41:02 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2017-09-12 12:41:02 +0900 |
| commit | 5760226e71e2dbf87d31d8aad2d0cdaa0a18748a (patch) | |
| tree | 2a9bf86d1468d86a9dd99d4bc4855f1f83a7cdff | |
| parent | d6e41c3e512673dac91906416a9c4543bbb2ab19 (diff) | |
| download | mruby-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.c | 10 | ||||
| -rw-r--r-- | src/vm.c | 37 |
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) { @@ -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; } |
