summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorh2so5 <[email protected]>2014-01-05 16:22:58 +0900
committerh2so5 <[email protected]>2014-01-05 16:24:20 +0900
commit0e23038a60d8656d8d92291efdeb418f9b166c09 (patch)
tree8b0a973aaf55d0ebd5a812ac6124234a949b8625 /src
parent0b92025c3d1626f2b1508d3011b8d4bb012a0a17 (diff)
downloadmruby-0e23038a60d8656d8d92291efdeb418f9b166c09.tar.gz
mruby-0e23038a60d8656d8d92291efdeb418f9b166c09.zip
execute ensure clause correctly without OP_EPOP
Diffstat (limited to 'src')
-rw-r--r--src/vm.c7
1 files changed, 4 insertions, 3 deletions
diff --git a/src/vm.c b/src/vm.c
index 863e93f60..8e2d03f88 100644
--- a/src/vm.c
+++ b/src/vm.c
@@ -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;