diff options
| author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2007-04-19 17:37:03 +0000 |
|---|---|---|
| committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2007-04-19 17:37:03 +0000 |
| commit | fe32f825f2efc2c5629048f6b1db8ec094f9a1c8 (patch) | |
| tree | d5df9db3b8de33463cf782336d1e3edd240dde73 /eval.c | |
| parent | 2fd663d256c75bf34e46df0013022fe0a0d01a88 (diff) | |
| download | ruby-fe32f825f2efc2c5629048f6b1db8ec094f9a1c8.tar.gz ruby-fe32f825f2efc2c5629048f6b1db8ec094f9a1c8.tar.xz ruby-fe32f825f2efc2c5629048f6b1db8ec094f9a1c8.zip | |
* eval.c (ruby_cleanup): re-send signal. [ruby-dev:30516]
* eval_error.h (error_handle): no message when exiting by signal.
* intern.h (rb_thread_signal_raise, ruby_default_signal): prototypes.
* signal.c (esignal_init): takes a signal number and an optional
signal name.
* signal.c (interrupt_init): pass SIGINT always.
* signal.c (ruby_default_signal): invoke system default signal
handler.
* signal.c (rb_f_kill): use NUM2PIDT instead of NUM2INT.
* signal.c (rb_signal_exec, trap): handle SIGTERM. [ruby-dev:30505]
* thread.c (rb_thread_signal_raise): now takes signal number instead
of signal name.
* thread.c (rb_thread_signal_exit): since rb_make_exception() calls
#exception method, rb_class_new_instance() is not needed here.
* yarvcore.h (struct rb_vm_struct), eval_jump.h (terminate_process):
exit_code is no longer stored in VM.
git-svn-id: http://svn.ruby-lang.org/repos/ruby/trunk@12199 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'eval.c')
| -rw-r--r-- | eval.c | 35 |
1 files changed, 18 insertions, 17 deletions
@@ -153,40 +153,41 @@ ruby_finalize(void) int ruby_cleanup(int ex) { - int state; - volatile VALUE err = GET_THREAD()->errinfo; + int state, i; + volatile VALUE errs[2] = {GET_THREAD()->errinfo, 0}; rb_vm_t *vm = GET_THREAD()->vm; - /* th->errinfo contains a NODE while break'ing */ - if (RTEST(err) && (TYPE(err) != T_NODE) && - rb_obj_is_kind_of(err, rb_eSystemExit)) { - vm->exit_code = NUM2INT(rb_iv_get(err, "status")); - } - else { - vm->exit_code = 0; - } - GET_THREAD()->safe_level = 0; Init_stack((void *)&state); PUSH_THREAD_TAG(); if ((state = EXEC_TAG()) == 0) { - if (GET_THREAD()->errinfo) { - err = GET_THREAD()->errinfo; - } ruby_finalize_0(); } else if (ex == 0) { ex = state; } + errs[1] = GET_THREAD()->errinfo; rb_thread_terminate_all(); - GET_THREAD()->errinfo = err; + GET_THREAD()->errinfo = errs[0]; ex = error_handle(ex); ruby_finalize_1(); POP_THREAD_TAG(); + rb_thread_stop_timer_thread(); - if (vm->exit_code) { - return vm->exit_code; + for (i = 2; i > 0; --i) { + VALUE err = errs[i]; + + /* th->errinfo contains a NODE while break'ing */ + if (!RTEST(err) || (TYPE(err) == T_NODE)) continue; + + if (rb_obj_is_kind_of(err, rb_eSystemExit)) { + return sysexit_status(err); + } + else if (rb_obj_is_kind_of(err, rb_eSignal)) { + ruby_default_signal(NUM2INT(rb_iv_get(err, "signo"))); + } } + return ex; } |
