diff options
author | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2005-06-12 16:58:43 +0000 |
---|---|---|
committer | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2005-06-12 16:58:43 +0000 |
commit | e344e979fca46b0d504f46fbfaf09e7e97975043 (patch) | |
tree | 9a9cfa0a6235c578d713891a55a8a9aeac8bb817 | |
parent | 03e99537c5cb376c5250ed99c2b498d3cc3d7030 (diff) | |
download | ruby-e344e979fca46b0d504f46fbfaf09e7e97975043.tar.gz ruby-e344e979fca46b0d504f46fbfaf09e7e97975043.tar.xz ruby-e344e979fca46b0d504f46fbfaf09e7e97975043.zip |
* 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]
* lib/delegate.rb (SimpleDelegator::__setobj__): need check for
recursive delegation. [ruby-core:04940]
* misc/ruby-mode.el (ruby-expr-beg): fix looking point drift.
git-svn-id: http://svn.ruby-lang.org/repos/ruby/branches/ruby_1_8@8614 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | ChangeLog | 27 | ||||
-rw-r--r-- | configure.in | 2 | ||||
-rw-r--r-- | eval.c | 39 | ||||
-rw-r--r-- | intern.h | 1 | ||||
-rw-r--r-- | lib/delegate.rb | 2 | ||||
-rw-r--r-- | misc/ruby-mode.el | 4 | ||||
-rw-r--r-- | missing.h | 4 | ||||
-rw-r--r-- | missing/mkdir.c | 104 | ||||
-rw-r--r-- | signal.c | 3 |
9 files changed, 70 insertions, 116 deletions
@@ -1,3 +1,21 @@ +Mon Jun 13 01:54:20 2005 Yukihiro Matsumoto <matz@ruby-lang.org> + + * 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). + +Fri Jun 10 23:35:34 2005 Yukihiro Matsumoto <matz@ruby-lang.org> + + * missing/mkdir.c: remove. [ruby-core:05177] + Fri Jun 10 22:54:26 2005 Nobuyoshi Nakada <nobu@ruby-lang.org> * missing.h: fd_set stuffs need sys/types.h. fixed: [ruby-core:05179] @@ -22,6 +40,15 @@ Thu Jun 9 19:55:41 2005 Tanaka Akira <akr@m17n.org> * gc.c (Init_stack): remove IA64_MAGIC_STACK_LIMIT. +Thu Jun 9 11:55:34 2005 Yukihiro Matsumoto <matz@ruby-lang.org> + + * lib/delegate.rb (SimpleDelegator::__setobj__): need check for + recursive delegation. [ruby-core:04940] + +Wed Jun 8 18:47:10 2005 Yukihiro Matsumoto <matz@ruby-lang.org> + + * misc/ruby-mode.el (ruby-expr-beg): fix looking point drift. + Wed Jun 8 11:11:34 2005 Yukihiro Matsumoto <matz@ruby-lang.org> * bignum.c (get2comp): calculate proper 2's complement for diff --git a/configure.in b/configure.in index 4e0dc1490..35fd46e7f 100644 --- a/configure.in +++ b/configure.in @@ -423,7 +423,7 @@ AC_FUNC_ALLOCA AC_FUNC_MEMCMP AC_FUNC_FSEEKO AC_CHECK_FUNCS(ftello) -AC_REPLACE_FUNCS(dup2 memmove mkdir strcasecmp strncasecmp strerror strftime\ +AC_REPLACE_FUNCS(dup2 memmove strcasecmp strncasecmp strerror strftime\ strchr strstr strtoul crypt flock vsnprintf\ isnan finite isinf hypot acosh erf) AC_CHECK_FUNCS(fmod killpg wait4 waitpid syscall chroot fsync getcwd\ @@ -1354,6 +1354,14 @@ 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; { @@ -1399,8 +1407,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(); @@ -4334,6 +4341,9 @@ rb_f_exit(argc, argv) break; default: istatus = NUM2INT(status); +#if EXIT_SUCCESS != 0 + if (istatus == 0) istatus = EXIT_SUCCESS; +#endif break; } } @@ -10021,8 +10031,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: @@ -11970,6 +11979,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; @@ -210,6 +210,7 @@ VALUE rb_thread_create _((VALUE (*)(ANYARGS), void*)); void rb_thread_interrupt _((void)); void rb_thread_trap_eval _((VALUE, int, int)); void rb_thread_signal_raise _((char*)); +void rb_thread_signal_exit _((void)); int rb_thread_select _((int, fd_set *, fd_set *, fd_set *, struct timeval *)); void rb_thread_wait_for _((struct timeval)); VALUE rb_thread_current _((void)); diff --git a/lib/delegate.rb b/lib/delegate.rb index deffcaf0f..2a30bc94b 100644 --- a/lib/delegate.rb +++ b/lib/delegate.rb @@ -73,6 +73,7 @@ class SimpleDelegator<Delegator end def __setobj__(obj) + raise ArgumentError, "cannot delegate to self" if self.equal?(obj) @_sd_obj = obj end @@ -110,6 +111,7 @@ def DelegateClass(superclass) @_dc_obj end def __setobj__(obj) + raise ArgumentError, "cannot delegate to self" if self.equal?(obj) @_dc_obj = obj end def clone diff --git a/misc/ruby-mode.el b/misc/ruby-mode.el index e13e84633..e0dd56846 100644 --- a/misc/ruby-mode.el +++ b/misc/ruby-mode.el @@ -302,8 +302,8 @@ The variable ruby-indent-level controls the amount of indentation. (defun ruby-expr-beg (&optional option) (save-excursion (store-match-data nil) - (let ((start (point)) - (space (skip-chars-backward " \t"))) + (let ((space (skip-chars-backward " \t")) + (start (point))) (cond ((bolp) t) ((progn @@ -84,10 +84,6 @@ extern int memcmp _((char *, char *, int)); extern void *memmove _((void *, void *, int)); #endif -#ifndef HAVE_MKDIR -extern int mkdir _((char *, int)); -#endif - /* #ifndef HAVE_MODF extern double modf _((double, double *)); diff --git a/missing/mkdir.c b/missing/mkdir.c deleted file mode 100644 index ed1476db9..000000000 --- a/missing/mkdir.c +++ /dev/null @@ -1,104 +0,0 @@ -/* - * Written by Robert Rother, Mariah Corporation, August 1985. - * - * If you want it, it's yours. All I ask in return is that if you - * figure out how to do this in a Bourne Shell script you send me - * a copy. - * sdcsvax!rmr or rmr@uscd - * - * Severely hacked over by John Gilmore to make a 4.2BSD compatible - * subroutine. 11Mar86; hoptoad!gnu - * - * Modified by rmtodd@uokmax 6-28-87 -- when making an already existing dir, - * subroutine didn't return EEXIST. It does now. - */ - -#include <sys/stat.h> -#include <errno.h> -/* - * Make a directory. - */ -int -mkdir (dpath, dmode) - char *dpath; - int dmode; -{ - int cpid, status; - struct stat statbuf; - - if (stat (dpath, &statbuf) == 0) - { - errno = EEXIST; /* Stat worked, so it already exists */ - return -1; - } - - /* If stat fails for a reason other than non-existence, return error */ - if (errno != ENOENT) - return -1; - - switch (cpid = fork ()) - { - - case -1: /* Error in fork() */ - return (-1); /* Errno is set already */ - - case 0: /* Child process */ - /* - * Cheap hack to set mode of new directory. Since this - * child process is going away anyway, we zap its umask. - * FIXME, this won't suffice to set SUID, SGID, etc. on this - * directory. Does anybody care? - */ - status = umask (0); /* Get current umask */ - status = umask (status | (0777 & ~dmode)); /* Set for mkdir */ - execl ("/bin/mkdir", "mkdir", dpath, (char *) 0); - _exit (-1); /* Can't exec /bin/mkdir */ - - default: /* Parent process */ - while (cpid != wait (&status)); /* Wait for kid to finish */ - } - - if (WIFSIGNALED (status) || WEXITSTATUS (status) != 0) - { - errno = EIO; /* We don't know why, but */ - return -1; /* /bin/mkdir failed */ - } - - return 0; -} - -int -rmdir (dpath) - char *dpath; -{ - int cpid, status; - struct stat statbuf; - - if (stat (dpath, &statbuf) != 0) - { - /* Stat just set errno. We don't have to */ - return -1; - } - - switch (cpid = fork ()) - { - - case -1: /* Error in fork() */ - return (-1); /* Errno is set already */ - - case 0: /* Child process */ - execl ("/bin/rmdir", "rmdir", dpath, (char *) 0); - _exit (-1); /* Can't exec /bin/mkdir */ - - default: /* Parent process */ - while (cpid != wait (&status)); /* Wait for kid to finish */ - } - - if (WIFSIGNALED (status) || WEXITSTATUS (status) != 0) - { - errno = EIO; /* We don't know why, but */ - return -1; /* /bin/rmdir failed */ - } - - return 0; -} @@ -33,6 +33,7 @@ static struct signals { char *signm; int signo; } siglist [] = { + {"EXIT", 0}, #ifdef SIGHUP {"HUP", SIGHUP}, #endif @@ -508,7 +509,7 @@ static RETSIGTYPE sigexit(sig) int sig; { - rb_exit(0); + rb_thread_signal_exit(); } static VALUE |