Skip to content

Commit 6c299aa

Browse files
committed
fixed wrong stack adjustment for ensure clauses; fix #3175
1 parent 0b8d8dd commit 6c299aa

File tree

2 files changed

+7
-1
lines changed

2 files changed

+7
-1
lines changed

src/vm.c

+3
Original file line numberDiff line numberDiff line change
@@ -1513,6 +1513,7 @@ mrb_vm_exec(mrb_state *mrb, struct RProc *proc, mrb_code *pc)
15131513
/* A B return R(A) (B=normal,in-block return/break) */
15141514
if (mrb->exc) {
15151515
mrb_callinfo *ci;
1516+
mrb_value *stk;
15161517
int eidx;
15171518

15181519
L_RAISE:
@@ -1524,6 +1525,7 @@ mrb_vm_exec(mrb_state *mrb, struct RProc *proc, mrb_code *pc)
15241525
if (ci->ridx == 0) goto L_STOP;
15251526
goto L_RESCUE;
15261527
}
1528+
stk = mrb->c->stack;
15271529
while (ci[0].ridx == ci[-1].ridx) {
15281530
cipop(mrb);
15291531
ci = mrb->c->ci;
@@ -1533,6 +1535,7 @@ mrb_vm_exec(mrb_state *mrb, struct RProc *proc, mrb_code *pc)
15331535
MRB_THROW(prev_jmp);
15341536
}
15351537
if (ci == mrb->c->cibase) {
1538+
mrb->c->stack = stk;
15361539
while (eidx > 0) {
15371540
ecall(mrb, --eidx);
15381541
}

test/t/exception.rb

+4-1
Original file line numberDiff line numberDiff line change
@@ -338,10 +338,13 @@ def b
338338
begin
339339
1 * "b"
340340
ensure
341-
@e = self.z
341+
@e = self.zz
342342
end
343343
end
344344

345+
def zz
346+
true
347+
end
345348
def z
346349
true
347350
end

0 commit comments

Comments
 (0)