summaryrefslogtreecommitdiff
path: root/eval.c
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2007-04-19 17:37:03 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2007-04-19 17:37:03 +0000
commit3fc37d71c4a1a25c3a77464c614595703d63c2e6 (patch)
treed5df9db3b8de33463cf782336d1e3edd240dde73 /eval.c
parenta73894337a830cdd32a913964f3150bc35269975 (diff)
* 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: svn+ssh://ci.ruby-lang.org/ruby/trunk@12199 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'eval.c')
-rw-r--r--eval.c35
1 files changed, 18 insertions, 17 deletions
diff --git a/eval.c b/eval.c
index b72fbe44de..a7f5cbbd0b 100644
--- a/eval.c
+++ b/eval.c
@@ -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;
}