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 /src/vm.c | |
| 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.
Diffstat (limited to 'src/vm.c')
| -rw-r--r-- | src/vm.c | 37 |
1 files changed, 20 insertions, 17 deletions
@@ -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; } |
