diff options
| author | h2so5 <[email protected]> | 2014-01-05 16:22:58 +0900 |
|---|---|---|
| committer | h2so5 <[email protected]> | 2014-01-05 16:24:20 +0900 |
| commit | 0e23038a60d8656d8d92291efdeb418f9b166c09 (patch) | |
| tree | 8b0a973aaf55d0ebd5a812ac6124234a949b8625 /src/vm.c | |
| parent | 0b92025c3d1626f2b1508d3011b8d4bb012a0a17 (diff) | |
| download | mruby-0e23038a60d8656d8d92291efdeb418f9b166c09.tar.gz mruby-0e23038a60d8656d8d92291efdeb418f9b166c09.zip | |
execute ensure clause correctly without OP_EPOP
Diffstat (limited to 'src/vm.c')
| -rw-r--r-- | src/vm.c | 7 |
1 files changed, 4 insertions, 3 deletions
@@ -264,7 +264,7 @@ ecall(mrb_state *mrb, int i) p = mrb->c->ensure[i]; if (!p) return; - if (mrb->c->ci->eidx < i) + if (mrb->c->ci->eidx > i) mrb->c->ci->eidx = i; ci = cipush(mrb); ci->stackidx = mrb->c->stack - mrb->c->stbase; @@ -857,9 +857,10 @@ mrb_context_run(mrb_state *mrb, struct RProc *proc, mrb_value self, unsigned int /* A A.times{ensure_pop().call} */ int n; int a = GETARG_A(i); + mrb_callinfo *ci = mrb->c->ci; - for (n=0; n<a; n++) { - ecall(mrb, --mrb->c->ci->eidx); + for (n=0; n<a && ci->eidx > ci[-1].eidx; n++) { + ecall(mrb, --ci->eidx); ARENA_RESTORE(mrb, ai); } NEXT; |
