From 8db3dc39d60870e07cbdfec5e594e0f49b0733c7 Mon Sep 17 00:00:00 2001 From: matz Date: Sun, 12 Jun 2005 16:56:06 +0000 Subject: * signal.c (sigexit): call rb_thread_signal_exit() instead of rb_exit(). [ruby-dev:26347] * eval.c (rb_thread_signal_exit): a new function to exit on main thread. * eval.c (rb_thread_switch): exit status should be retrieved from ruby_errinfo. * eval.c (rb_f_exit): ensure exit(0) should call exit(EXIT_SUCCESS). * missing/mkdir.c: remove. [ruby-core:05177] * hash.c (env_aset): do not treat nil as key-removing value. [ruby-list:40865] * parse.y (method_call): allow aref expression ([]) to take a block. * parse.y (block_dup_check): a function to check duplication of a block argument and an actual block. * lib/delegate.rb (SimpleDelegator::__setobj__): need check for recursive delegation. [ruby-core:04940] * lib/cgi.rb: add underscore aliases CGI::escape_html, CGI::unescape_html, CGI::escape_element, CGI::unescape_element. [ruby-core:05058] * misc/ruby-mode.el (ruby-expr-beg): fix looking point drift. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@8613 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- eval.c | 39 +++++++++++++++++++++++++++++++++++---- 1 file changed, 35 insertions(+), 4 deletions(-) (limited to 'eval.c') diff --git a/eval.c b/eval.c index ce82e6c8eb..0fbc538c74 100644 --- a/eval.c +++ b/eval.c @@ -1392,6 +1392,14 @@ static int thread_reset_raised(); static VALUE exception_error; static VALUE sysstack_error; +static int +sysexit_status(err) + VALUE err; +{ + VALUE st = rb_iv_get(err, "status"); + return NUM2INT(st); +} + static int error_handle(ex) int ex; @@ -1438,8 +1446,7 @@ error_handle(ex) case TAG_RAISE: case TAG_FATAL: if (rb_obj_is_kind_of(ruby_errinfo, rb_eSystemExit)) { - VALUE st = rb_iv_get(ruby_errinfo, "status"); - status = NUM2INT(st); + status = sysexit_status(ruby_errinfo); } else { error_print(); @@ -4386,6 +4393,9 @@ rb_f_exit(argc, argv) break; default: istatus = NUM2INT(status); +#if EXIT_SUCCESS != 0 + if (istatus == 0) istatus = EXIT_SUCCESS; +#endif break; } } @@ -10383,8 +10393,7 @@ rb_thread_switch(n) case RESTORE_EXIT: ruby_errinfo = th_raise_exception; ruby_current_node = th_raise_node; - error_print(); - terminate_process(EXIT_FAILURE, 0, 0); + terminate_process(sysexit_status(ruby_errinfo), 0, 0); break; case RESTORE_NORMAL: default: @@ -12464,6 +12473,28 @@ rb_thread_trap_eval(cmd, sig, safe) rb_thread_restore_context(curr_thread, RESTORE_TRAP); } +void +rb_thread_signal_exit() +{ + VALUE args[2]; + + rb_thread_critical = 0; + if (curr_thread == main_thread) { + rb_thread_ready(curr_thread); + rb_exit(EXIT_SUCCESS); + } + args[0] = INT2NUM(EXIT_SUCCESS); + args[1] = rb_str_new2("exit"); + rb_thread_ready(main_thread); + if (!rb_thread_dead(curr_thread)) { + if (THREAD_SAVE_CONTEXT(curr_thread)) { + return; + } + } + rb_thread_main_jump(rb_class_new_instance(2, args, rb_eSystemExit), + RESTORE_EXIT); +} + static VALUE rb_thread_raise(argc, argv, th) int argc; -- cgit v1.2.3