diff options
Diffstat (limited to 'eval_jump.c')
| -rw-r--r-- | eval_jump.c | 54 |
1 files changed, 27 insertions, 27 deletions
diff --git a/eval_jump.c b/eval_jump.c index 75d4ad0207..6ee8ff4a6f 100644 --- a/eval_jump.c +++ b/eval_jump.c @@ -40,7 +40,7 @@ rb_f_at_exit(VALUE _) VALUE proc; if (!rb_block_given_p()) { - rb_raise(rb_eArgError, "called without a block"); + rb_raise(rb_eArgError, "called without a block"); } proc = rb_block_proc(); rb_set_end_proc(rb_call_end_proc, proc); @@ -48,7 +48,7 @@ rb_f_at_exit(VALUE _) } struct end_proc_data { - void (*func) (); + void (*func) (VALUE); VALUE data; struct end_proc_data *next; }; @@ -63,10 +63,10 @@ rb_set_end_proc(void (*func)(VALUE), VALUE data) rb_thread_t *th = GET_THREAD(); if (th->top_wrapper) { - list = &ephemeral_end_procs; + list = &ephemeral_end_procs; } else { - list = &end_procs; + list = &end_procs; } link->next = *list; link->func = func; @@ -81,13 +81,13 @@ rb_mark_end_proc(void) link = end_procs; while (link) { - rb_gc_mark(link->data); - link = link->next; + rb_gc_mark(link->data); + link = link->next; } link = ephemeral_end_procs; while (link) { - rb_gc_mark(link->data); - link = link->next; + rb_gc_mark(link->data); + link = link->next; } } @@ -99,11 +99,11 @@ exec_end_procs_chain(struct end_proc_data *volatile *procs, VALUE *errp) VALUE errinfo = *errp; while ((link = *procs) != 0) { - *procs = link->next; - endproc = *link; - xfree(link); - (*endproc.func) (endproc.data); - *errp = errinfo; + *procs = link->next; + endproc = *link; + SIZED_FREE(link); + (*endproc.func) (endproc.data); + *errp = errinfo; } } @@ -112,21 +112,21 @@ rb_ec_exec_end_proc(rb_execution_context_t * ec) { enum ruby_tag_type state; volatile VALUE errinfo = ec->errinfo; - - EC_PUSH_TAG(ec); - if ((state = EC_EXEC_TAG()) == TAG_NONE) { - again: - exec_end_procs_chain(&ephemeral_end_procs, &ec->errinfo); - exec_end_procs_chain(&end_procs, &ec->errinfo); - } - else { - EC_TMPPOP_TAG(); - error_handle(ec, state); - if (!NIL_P(ec->errinfo)) errinfo = ec->errinfo; - EC_REPUSH_TAG(); - goto again; + volatile bool finished = false; + + while (!finished) { + EC_PUSH_TAG(ec); + if ((state = EC_EXEC_TAG()) == TAG_NONE) { + exec_end_procs_chain(&ephemeral_end_procs, &ec->errinfo); + exec_end_procs_chain(&end_procs, &ec->errinfo); + finished = true; + } + EC_POP_TAG(); + if (state != TAG_NONE) { + error_handle(ec, ec->errinfo, state); + if (!NIL_P(ec->errinfo)) errinfo = ec->errinfo; + } } - EC_POP_TAG(); ec->errinfo = errinfo; } |
