diff --git a/eval_jump.c b/eval_jump.c index 092ab87..16fb485 100644 --- a/eval_jump.c +++ b/eval_jump.c @@ -102,10 +102,8 @@ rb_exec_end_proc(void) rb_thread_t *th = GET_THREAD(); volatile VALUE errinfo = th->errinfo; - while (ephemeral_end_procs) { - link = ephemeral_end_procs; - ephemeral_end_procs = link->next; - + link = ephemeral_end_procs; + while (link) { PUSH_TAG(); if ((status = EXEC_TAG()) == 0) { rb_set_safe_level_force(link->safe); @@ -116,13 +114,11 @@ rb_exec_end_proc(void) error_handle(status); if (!NIL_P(th->errinfo)) errinfo = th->errinfo; } - xfree(link); + link = link->next; } - while (end_procs) { - link = end_procs; - end_procs = link->next; - + link = end_procs; + while (link) { PUSH_TAG(); if ((status = EXEC_TAG()) == 0) { rb_set_safe_level_force(link->safe); @@ -133,8 +129,21 @@ rb_exec_end_proc(void) error_handle(status); if (!NIL_P(th->errinfo)) errinfo = th->errinfo; } + link = link->next; + } + + link = ephemeral_end_procs; + while (link) { + xfree(link); + link = link->next; + } + + link = end_procs; + while (link) { xfree(link); + link = link->next; } + rb_set_safe_level_force(safe); th->errinfo = errinfo; }