diff options
Diffstat (limited to 'eval.c')
-rw-r--r-- | eval.c | 39 |
1 files changed, 21 insertions, 18 deletions
@@ -25,6 +25,7 @@ #endif NORETURN(void rb_raise_jump(VALUE, VALUE)); +void rb_ec_clear_current_thread_trace_func(const rb_execution_context_t *ec); VALUE rb_eLocalJumpError; VALUE rb_eSysStackError; @@ -109,17 +110,18 @@ ruby_init(void) void * ruby_options(int argc, char **argv) { + rb_execution_context_t *ec = GET_EC(); enum ruby_tag_type state; void *volatile iseq = 0; ruby_init_stack((void *)&iseq); - EC_PUSH_TAG(GET_EC()); + EC_PUSH_TAG(ec); if ((state = EC_EXEC_TAG()) == TAG_NONE) { SAVE_ROOT_JMPBUF(GET_THREAD(), iseq = ruby_process_options(argc, argv)); } else { - rb_clear_trace_func(); - state = error_handle(state); + rb_ec_clear_current_thread_trace_func(ec); + state = error_handle(ec, state); iseq = (void *)INT2FIX(state); } EC_POP_TAG(); @@ -127,23 +129,23 @@ ruby_options(int argc, char **argv) } static void -ruby_finalize_0(void) +rb_ec_teardown(rb_execution_context_t *ec) { - EC_PUSH_TAG(GET_EC()); + EC_PUSH_TAG(ec); if (EC_EXEC_TAG() == TAG_NONE) { - rb_trap_exit(); + rb_vm_trap_exit(rb_ec_vm_ptr(ec)); } EC_POP_TAG(); - rb_exec_end_proc(); - rb_clear_trace_func(); + rb_ec_exec_end_proc(ec); + rb_ec_clear_current_thread_trace_func(ec); } static void -ruby_finalize_1(void) +rb_ec_finalize(rb_execution_context_t *ec) { ruby_sig_finalize(); - GET_EC()->errinfo = Qnil; - rb_gc_call_finalizer_at_exit(); + ec->errinfo = Qnil; + rb_objspace_call_finalizer(rb_ec_vm_ptr(ec)->objspace); } /** Runs the VM finalization processes. @@ -156,8 +158,9 @@ ruby_finalize_1(void) void ruby_finalize(void) { - ruby_finalize_0(); - ruby_finalize_1(); + rb_execution_context_t *ec = GET_EC(); + rb_ec_teardown(ec); + rb_ec_finalize(ec); } /** Destructs the VM. @@ -192,7 +195,7 @@ ruby_cleanup(volatile int ex) rb_set_safe_level_force(0); ruby_init_stack(&errs[STACK_UPPER(errs, 0, 1)]); - SAVE_ROOT_JMPBUF(th, ruby_finalize_0()); + SAVE_ROOT_JMPBUF(th, rb_ec_teardown(th->ec)); step_1: step++; /* protect from Thread#raise */ @@ -209,7 +212,7 @@ ruby_cleanup(volatile int ex) if (ex == 0) ex = state; } th->ec->errinfo = errs[1]; - sysex = error_handle(ex); + sysex = error_handle(th->ec, ex); state = 0; for (nerr = 0; nerr < numberof(errs); ++nerr) { @@ -236,13 +239,13 @@ ruby_cleanup(volatile int ex) mjit_finish(true); // We still need ISeqs here. - ruby_finalize_1(); + rb_ec_finalize(th->ec); /* unlock again if finalizer took mutexes. */ - rb_threadptr_unlock_all_locking_mutexes(GET_THREAD()); + rb_threadptr_unlock_all_locking_mutexes(th); EC_POP_TAG(); rb_thread_stop_timer_thread(); - ruby_vm_destruct(GET_VM()); + ruby_vm_destruct(th->vm); if (state) ruby_default_signal(state); return sysex; |