Commit 6adaf3b8 authored by Yukihiro Matsumoto's avatar Yukihiro Matsumoto

should invoke ensure clauses just before terminating mrb_sun; close #270

parent 3b2ff614
...@@ -164,6 +164,7 @@ ecall(mrb_state *mrb, int i) ...@@ -164,6 +164,7 @@ ecall(mrb_state *mrb, int i)
struct RProc *p; struct RProc *p;
mrb_callinfo *ci; mrb_callinfo *ci;
mrb_value *self = mrb->stack; mrb_value *self = mrb->stack;
struct RObject *exc;
p = mrb->ensure[i]; p = mrb->ensure[i];
ci = cipush(mrb); ci = cipush(mrb);
...@@ -175,7 +176,9 @@ ecall(mrb_state *mrb, int i) ...@@ -175,7 +176,9 @@ ecall(mrb_state *mrb, int i)
ci->nregs = p->body.irep->nregs; ci->nregs = p->body.irep->nregs;
ci->target_class = p->target_class; ci->target_class = p->target_class;
mrb->stack = mrb->stack + ci[-1].nregs; mrb->stack = mrb->stack + ci[-1].nregs;
exc = mrb->exc; mrb->exc = 0;
mrb_run(mrb, p, *self); mrb_run(mrb, p, *self);
mrb->exc = exc;
} }
mrb_value mrb_value
...@@ -999,13 +1002,18 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) ...@@ -999,13 +1002,18 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self)
L_RETURN: L_RETURN:
if (mrb->exc) { if (mrb->exc) {
mrb_callinfo *ci; mrb_callinfo *ci;
int eidx;
L_RAISE: L_RAISE:
ci = mrb->ci; ci = mrb->ci;
eidx = mrb->ci->eidx;
if (ci == mrb->cibase) goto L_STOP; if (ci == mrb->cibase) goto L_STOP;
while (ci[0].ridx == ci[-1].ridx) { while (ci[0].ridx == ci[-1].ridx) {
cipop(mrb); cipop(mrb);
ci = mrb->ci; ci = mrb->ci;
while (eidx > mrb->ci->eidx) {
ecall(mrb, --eidx);
}
if (ci == mrb->cibase) { if (ci == mrb->cibase) {
if (ci->ridx == 0) { if (ci->ridx == 0) {
mrb->stack = mrb->stbase; mrb->stack = mrb->stbase;
...@@ -1569,6 +1577,13 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) ...@@ -1569,6 +1577,13 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self)
CASE(OP_STOP) { CASE(OP_STOP) {
/* stop VM */ /* stop VM */
L_STOP: L_STOP:
{
int n = mrb->ci->eidx;
while (n--) {
ecall(mrb, n);
}
}
mrb->jmp = prev_jmp; mrb->jmp = prev_jmp;
if (mrb->exc) { if (mrb->exc) {
return mrb_obj_value(mrb->exc); return mrb_obj_value(mrb->exc);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment