From f33a61c28dadf8ff2bb86d36d6428f487b671708 Mon Sep 17 00:00:00 2001 From: matz Date: Mon, 6 Aug 2001 03:05:23 +0000 Subject: * string.c (rb_str_lstrip_bang): new method. * string.c (rb_str_rstrip_bang): new method. * string.c (rb_str_associate): should consider STR_ASSOC too. * eval.c (rb_undefined): do not recurse if method_missing is undefined. * process.c (proc_waitpid): now all arguments are optional. * process.c (Init_process): waitpid is now alias to wait. * process.c (Init_process): waitpid2 is now alias to wait2. * process.c (rb_waitpid): made public. * ext/pty/pty.c (pty_getpty): avoid disturbing SIGCHLD using thread and rb_waitpid. * process.c (proc_getpgrp): now takes no argument on all platforms. * process.c (proc_setpgrp): ditto. * ext/socket/socket.c (sock_s_pack_sockaddr_in): added Socket::pack_sockaddr_in(). [new] * ext/socket/socket.c (sock_s_pack_sockaddr_un): added Socket::pack_sockaddr_un(). [new] * ext/socket/socket.c (sock_s_pack_sockaddr_in): added Socket::unpack_sockaddr_in(). [new] * ext/socket/socket.c (sock_s_pack_sockaddr_un): added Socket::unpack_sockaddr_un(). [new] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@1666 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 49 ++++++++++++++++++++ array.c | 3 +- configure.in | 4 ++ doc/NEWS | 8 ++++ eval.c | 10 +++- ext/pty/pty.c | 126 +++++++++++++------------------------------------- ext/socket/socket.c | 74 ++++++++++++++++++++++++++++-- intern.h | 1 + io.c | 4 ++ lib/cgi/session.rb | 7 ++- misc/ruby-mode.el | 45 ++++++++++++++---- numeric.c | 17 +++---- pack.c | 16 ++----- parse.y | 3 +- process.c | 130 +++++++++++++++------------------------------------- signal.c | 2 +- string.c | 71 ++++++++++++++++++++++------ version.h | 4 +- 18 files changed, 331 insertions(+), 243 deletions(-) diff --git a/ChangeLog b/ChangeLog index 76e476d067..334e768a86 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,9 +1,58 @@ +Mon Aug 6 03:29:03 2001 Yukihiro Matsumoto + + * string.c (rb_str_lstrip_bang): new method. + + * string.c (rb_str_rstrip_bang): new method. + +Sun Aug 5 19:28:39 2001 Nobuyoshi Nakada + + * string.c (rb_str_associate): should consider STR_ASSOC too. + +Sun Aug 5 07:46:18 2001 Nobuyoshi Nakada + + * eval.c (rb_undefined): do not recurse if method_missing is + undefined. + +Thu Aug 2 21:37:32 2001 Yukihiro Matsumoto + + * process.c (proc_waitpid): now all arguments are optional. + + * process.c (Init_process): waitpid is now alias to wait. + + * process.c (Init_process): waitpid2 is now alias to wait2. + + * process.c (rb_waitpid): made public. + + * ext/pty/pty.c (pty_getpty): avoid disturbing SIGCHLD using + thread and rb_waitpid. + +Thu Aug 2 11:23:07 2001 Yukihiro Matsumoto + + * process.c (proc_getpgrp): now takes no argument on all + platforms. + + * process.c (proc_setpgrp): ditto. + Thu Aug 2 01:29:42 2001 Nobuyoshi Nakada * file.c (strrdirsep): removed meaningless code. * file.c (rb_file_s_expand_path): reverted to 1.66. +Wed Aug 1 16:17:47 2001 Yukihiro Matsumoto + + * ext/socket/socket.c (sock_s_pack_sockaddr_in): added + Socket::pack_sockaddr_in(). [new] + + * ext/socket/socket.c (sock_s_pack_sockaddr_un): added + Socket::pack_sockaddr_un(). [new] + + * ext/socket/socket.c (sock_s_pack_sockaddr_in): added + Socket::unpack_sockaddr_in(). [new] + + * ext/socket/socket.c (sock_s_pack_sockaddr_un): added + Socket::unpack_sockaddr_un(). [new] + Wed Aug 1 15:42:16 2001 Usaku Nakamura * eval.c (ruby_run): avoid VC++ warning. diff --git a/array.c b/array.c index 5acc45a1b2..4ca1dc3c2d 100644 --- a/array.c +++ b/array.c @@ -735,6 +735,7 @@ rb_ary_dup(ary) OBJSETUP(dup, rb_obj_type(ary), T_ARRAY); MEMCPY(RARRAY(dup)->ptr, RARRAY(ary)->ptr, VALUE, RARRAY(ary)->len); RARRAY(dup)->len = RARRAY(ary)->len; + OBJ_INFECT(dup, ary); return dup; } @@ -1736,7 +1737,7 @@ Init_Array() rb_define_method(rb_cArray, "indexes", rb_ary_indexes, -1); rb_define_method(rb_cArray, "indices", rb_ary_indexes, -1); rb_define_method(rb_cArray, "clone", rb_ary_clone, 0); - rb_define_method(rb_cArray, "clone", rb_ary_dup, 0); + rb_define_method(rb_cArray, "dup", rb_ary_dup, 0); rb_define_method(rb_cArray, "join", rb_ary_join_m, -1); rb_define_method(rb_cArray, "reverse", rb_ary_reverse_m, 0); rb_define_method(rb_cArray, "reverse!", rb_ary_reverse_bang, 0); diff --git a/configure.in b/configure.in index ec4d3d7f86..2fd670dfe3 100644 --- a/configure.in +++ b/configure.in @@ -660,6 +660,10 @@ if test "$with_dln_a_out" != yes; then ;; esac rb_cv_dlopen=yes ;; + nto-qnx*) DLDFLAGS="-L/lib -L/usr/lib -L/usr/local/lib" + LDSHARED='ld -Bshareable -x' + LDFLAGS="-L/lib -L/usr/lib -L/usr/local/lib" + rb_cv_dlopen=yes;; cygwin*|mingw*) : ${LDSHARED="${DLLWRAP} --target=${target_os} --as=${AS} --dlltool-name=${DLLTOOL} --driver-name=${CC} --export-all -s"} rb_cv_dlopen=yes ;; *) LDSHARED='ld' ;; diff --git a/doc/NEWS b/doc/NEWS index ff24df1d40..ccb6b496bc 100644 --- a/doc/NEWS +++ b/doc/NEWS @@ -1,3 +1,11 @@ +: Socket::pack_sockaddr_in(), Socket::unpack_sockaddr_in() + + Added. Utility for direct Socket access. + +: Socket::pack_sockaddr_un(), Socket::unpack_sockaddr_un() + + Added. Utility for direct Socket access. + : String#casecmp Added. This is a case insensitive version of String#<=>. diff --git a/eval.c b/eval.c index 5300a6c1f9..439de65323 100644 --- a/eval.c +++ b/eval.c @@ -4213,12 +4213,18 @@ rb_undefined(obj, id, argc, argv, call_status) { VALUE *nargv; + last_call_status = call_status; + + if (id == missing) { + PUSH_FRAME(); + rb_f_missing(argc, argv, obj); + POP_FRAME(); + } + nargv = ALLOCA_N(VALUE, argc+1); nargv[0] = ID2SYM(id); MEMCPY(nargv+1, argv, VALUE, argc); - last_call_status = call_status; - return rb_funcall2(obj, missing, argc+1, nargv); } diff --git a/ext/pty/pty.c b/ext/pty/pty.c index 12063f958d..9d2fb52bcf 100644 --- a/ext/pty/pty.c +++ b/ext/pty/pty.c @@ -94,10 +94,6 @@ char SlaveName[DEVICELEN]; extern int errno; -#define MAX_PTY 16 -static int n_pty,last_pty; -static int chld_pid[MAX_PTY]; - #ifndef HAVE_SETEUID # ifdef HAVE_SETREUID # define seteuid(e) setreuid(-1, (e)) @@ -116,88 +112,44 @@ struct pty_info { }; static void -set_signal_action(action) - RETSIGTYPE (*action)(); +pty_raise(cpid) + int cpid; { -#ifdef __hpux - struct sigvec sv; - /* - * signal SIGCHLD should be delivered on stop of the child - */ - sv.sv_handler = action; - sv.sv_mask = sigmask(SIGCHLD); - sv.sv_flags = SV_BSDSIG; - sigvector(SIGCHLD, &sv, (struct sigvec *) 0); -#else /* not HPUX */ -#if defined(SA_NOCLDSTOP) - struct sigaction sa; - /* - * signal SIGCHLD should be delivered on stop of the child - * (for SVR4) - */ - sa.sa_handler = action; - sigemptyset(&sa.sa_mask); - sigaddset(&sa.sa_mask, SIGCHLD); - sa.sa_flags = 0; /* SA_NOCLDSTOP flag is removed */ - sigaction(SIGCHLD, &sa, (struct sigaction *) 0); -#else - signal(SIGCHLD,action); -#endif -#endif /* not HPUX */ + char buf[1024]; + snprintf(buf, sizeof(buf), + "eval %%Q{Thread.main.raise 'pty - stopped: %d'}, nil, \"%s\", %d", + cpid, ruby_sourcefile, ruby_sourceline); + rb_eval_string(buf); } -static void -reset_signal_action() +static VALUE +pty_syswait(pid) + int pid; { - set_signal_action(SIG_DFL); -} + int cpid, status; -static RETSIGTYPE -chld_changed() -{ - int cpid; - int i,n = -1; - int statusp; + cpid = rb_waitpid(pid, &status, WUNTRACED); - for (;;) { -#ifdef HAVE_WAITPID - cpid = waitpid(-1, &statusp, WUNTRACED|WNOHANG); -#else - cpid = wait3(&statusp, WUNTRACED|WNOHANG, 0); -#endif - if (cpid == 0 || cpid == -1) - return; - for (i = 0; i < last_pty; i++) { - if (chld_pid[i] == cpid) { - n = i; - goto catched; - } - } - rb_raise(rb_eRuntimeError, "fork: %d", cpid); - } - catched: + printf("PTY command (%d) finished (%d:%d)\n", pid, cpid, status); + if (cpid == 0 || cpid == -1) + return Qnil; #ifdef IF_STOPPED - if (IF_STOPPED(statusp)) { /* suspend */ - rb_raise(rb_eRuntimeError, "Stopped: %d",cpid); + if (IF_STOPPED(status)) { /* suspend */ + pty_raise(cpid); } #else #ifdef WIFSTOPPED - if (WIFSTOPPED(statusp)) { /* suspend */ - rb_raise(rb_eRuntimeError, "Stopped: %d",cpid); + if (WIFSTOPPED(status)) { /* suspend */ + pty_raise(cpid); } #else ---->> Either IF_STOPPED or WIFSTOPPED is needed <<---- #endif /* WIFSTOPPED */ #endif /* IF_STOPPED */ - if (n >= 0) { - chld_pid[n] = 0; - n_pty--; - if (n_pty == 0) - reset_signal_action(); - } - rb_raise(rb_eRuntimeError, "Child_changed: %d",cpid); + + return Qnil; } static void getDevice _((int*, int*)); @@ -227,7 +179,6 @@ establishShell(shellname, info) getDevice(&master,&slave); currentPid = getpid(); - set_signal_action(chld_changed); if((i = vfork()) < 0) { rb_sys_fail("fork failed"); } @@ -304,19 +255,6 @@ establishShell(shellname, info) close(slave); - if (n_pty == last_pty) { - chld_pid[n_pty] = i; - n_pty++; - last_pty++; - } - else { - for (j = 0; j < last_pty; j++) { - if (chld_pid[j] == 0) { - chld_pid[j] = i; - n_pty++; - } - } - } info->child_pid = i; info->fd = master; } @@ -426,16 +364,12 @@ static VALUE pty_getpty(self, shell) VALUE self, shell; { - VALUE res; + VALUE res, th; struct pty_info info; OpenFile *wfptr,*rfptr; NEWOBJ(rport, struct RFile); NEWOBJ(wport, struct RFile); - if (n_pty == MAX_PTY+1) { - rb_raise(rb_eRuntimeError, "Too many ptys are open"); - } - OBJSETUP(rport, rb_cFile, T_FILE); MakeOpenFile(rport, rfptr); @@ -457,32 +391,34 @@ pty_getpty(self, shell) rb_ary_store(res,1,(VALUE)wport); rb_ary_store(res,2,INT2FIX(info.child_pid)); + printf("start watching PTY command (%d)\n", info.child_pid); + th = rb_thread_create(pty_syswait, (void*)info.child_pid); if (rb_block_given_p()) { - rb_yield((VALUE)res); - reset_signal_action(); - return Qnil; + res = rb_yield((VALUE)res); + rb_funcall(th, rb_intern("kill"), 0, 0); + return res; } else { return (VALUE)res; } } -/* ruby function: protect_signal */ +/* ruby function: protect_signal - obsolete */ static VALUE pty_protect(self) VALUE self; { - reset_signal_action(); + rb_warn("PTY::protect_signal is no longer needed"); rb_yield(Qnil); - set_signal_action(chld_changed); return self; } +/* ruby function: reset_signal - obsolete */ static VALUE pty_reset_signal(self) VALUE self; { - reset_signal_action(); + rb_warn("PTY::reset_signal is no longer needed"); return self; } diff --git a/ext/socket/socket.c b/ext/socket/socket.c index 86f9dfcc28..d3e3fd53f0 100644 --- a/ext/socket/socket.c +++ b/ext/socket/socket.c @@ -1562,7 +1562,7 @@ static VALUE sock_s_socketpair(class, domain, type, protocol) VALUE class, domain, type, protocol; { -#if !defined(NT) && !defined(__BEOS__) && !defined(__EMX__) +#if !defined(NT) && !defined(__BEOS__) && !defined(__EMX__) && !defined(__QNXNTO__) int d, t, sp[2]; setup_domain_and_type(domain, &d, type, &t); @@ -1806,11 +1806,20 @@ sock_s_gethostbyaddr(argc, argv) { VALUE addr, type; struct hostent *h; + struct sockaddr *sa; + int t = AF_INET; rb_scan_args(argc, argv, "11", &addr, &type); - StringValue(addr); - h = gethostbyaddr(RSTRING(addr)->ptr, RSTRING(addr)->len, - NIL_P(type)?AF_INET:NUM2INT(type)); + sa = (struct sockaddr*)StringValuePtr(addr); + if (!NIL_P(type)) { + t = NUM2INT(type); + } +#ifdef INET6 + else if (RSTRING(addr)->len == 16) { + t = AF_INET6; + } +#endif + h = gethostbyaddr(RSTRING(addr)->ptr, RSTRING(addr)->len, t); return mkhostent(h); } @@ -2055,6 +2064,57 @@ sock_s_getnameinfo(argc, argv) rb_raise(rb_eSocket, "getnameinfo: %s", gai_strerror(error)); } +static VALUE +sock_s_pack_sockaddr_in(self, port, host) + VALUE self, port, host; +{ + struct addrinfo *res = ip_addrsetup(host, port); + VALUE addr = rb_str_new((char*)res->ai_addr, res->ai_addrlen); + + freeaddrinfo(res); + OBJ_INFECT(addr, port); + OBJ_INFECT(addr, host); + + return addr; +} + +static VALUE +sock_s_pack_sockaddr_un(self, path) + VALUE self, path; +{ + struct sockaddr_un sockaddr; + VALUE addr; + + MEMZERO(&sockaddr, struct sockaddr_un, 1); + sockaddr.sun_family = AF_UNIX; + strncpy(sockaddr.sun_path, StringValuePtr(path), sizeof(sockaddr.sun_path)-1); + addr = rb_str_new((char*)&sockaddr, sizeof(sockaddr)); + OBJ_INFECT(addr, path); + + return addr; +} + +static VALUE +sock_s_unpack_sockaddr_in(self, addr) + VALUE self, addr; +{ + struct sockaddr_in * sockaddr; + + sockaddr = (struct sockaddr_in*)StringValuePtr(addr); + return rb_assoc_new(INT2NUM(ntohs(sockaddr->sin_port)), mkipaddr(sockaddr)); +} + +static VALUE +sock_s_unpack_sockaddr_un(self, addr) + VALUE self, addr; +{ + struct sockaddr_un * sockaddr; + + sockaddr = (struct sockaddr_un*)StringValuePtr(addr); + /* xxx: should I check against sun_path size? */ + return rb_tainted_str_new2(sockaddr->sun_path); +} + static VALUE mConst; static void @@ -2164,6 +2224,12 @@ Init_socket() rb_define_singleton_method(rb_cSocket, "getservbyname", sock_s_getservbyaname, -1); rb_define_singleton_method(rb_cSocket, "getaddrinfo", sock_s_getaddrinfo, -1); rb_define_singleton_method(rb_cSocket, "getnameinfo", sock_s_getnameinfo, -1); + rb_define_singleton_method(rb_cSocket, "sockaddr_in", sock_s_pack_sockaddr_in, 2); + rb_define_singleton_method(rb_cSocket, "sockaddr_un", sock_s_pack_sockaddr_un, 1); + rb_define_singleton_method(rb_cSocket, "pack_sockaddr_in", sock_s_pack_sockaddr_in, 2); + rb_define_singleton_method(rb_cSocket, "pack_sockaddr_un", sock_s_pack_sockaddr_un, 1); + rb_define_singleton_method(rb_cSocket, "unpack_sockaddr_in", sock_s_unpack_sockaddr_in, 1); + rb_define_singleton_method(rb_cSocket, "unpack_sockaddr_un", sock_s_unpack_sockaddr_un, 1); /* constants */ mConst = rb_define_module_under(rb_cSocket, "Constants"); diff --git a/intern.h b/intern.h index 4cd56eac16..32970ddd81 100644 --- a/intern.h +++ b/intern.h @@ -275,6 +275,7 @@ void rb_lastline_set _((VALUE)); VALUE rb_sym_all_symbols _((void)); /* process.c */ int rb_proc_exec _((const char*)); +int rb_waitpid _((int,int*,int)); void rb_syswait _((int)); VALUE rb_proc_times _((VALUE)); /* range.c */ diff --git a/io.c b/io.c index 448fd60032..0d8f489511 100644 --- a/io.c +++ b/io.c @@ -31,6 +31,10 @@ # define USE_SETVBUF #endif +#ifdef __QNXNTO__ +#include "unix.h" +#endif + #include #if !defined(DJGPP) && !defined(NT) && !defined(__human68k__) #include diff --git a/lib/cgi/session.rb b/lib/cgi/session.rb index 9187dbf82d..23c9bdc2a4 100644 --- a/lib/cgi/session.rb +++ b/lib/cgi/session.rb @@ -12,7 +12,7 @@ class CGI def Session::callback(dbman) lambda{ - dbman.close + dbman[0].close unless dbman.empty? } end @@ -63,7 +63,8 @@ class CGI end) ] end - ObjectSpace::define_finalizer(self, Session::callback(@dbman)) + @dbprot = [@dbman] + ObjectSpace::define_finalizer(self, Session::callback(@dbprot)) end def [](key) @@ -89,10 +90,12 @@ class CGI def close @dbman.close + @dbprot.clear end def delete @dbman.delete + @dbprot.clear end class FileStore diff --git a/misc/ruby-mode.el b/misc/ruby-mode.el index d29e3bd82c..40f1eaa045 100644 --- a/misc/ruby-mode.el +++ b/misc/ruby-mode.el @@ -707,6 +707,9 @@ An end of a defun is found by moving forward from the beginning of one." (defvar ruby-font-lock-keywords (list + ;; trick + '("\\s-+" 0 nil t) + '("\\S-+" 0 nil t) (cons (concat "\\(^\\|[^_:.@$]\\|\\.\\.\\)\\b\\(" (mapconcat @@ -750,16 +753,14 @@ An end of a defun is found by moving forward from the beginning of one." "\\|") "\\)\\>\\([^_]\\|$\\)") 2) - ;; regexps - '("/\\(\\(\\\\/\\|[^/\n]\\)*\\)/\\([iop]*\\)" - (1 font-lock-string-face) - (3 font-lock-constant-face)) ;; variables '("\\(^\\|[^_:.@$]\\|\\.\\.\\)\\b\\(nil\\|self\\|true\\|false\\)\\b\\([^_]\\|$\\)" 2 font-lock-variable-name-face) ;; variables - '("[$@].\\(\\w\\|_\\)*" - 0 font-lock-variable-name-face) + '("\\(\\$\\(\\W\\|[0-9]\\)\\)\\W" + 1 font-lock-variable-name-face t) + '("\\($\\|@\\|@@\\)\\(\\w\\(\\w\\|_\\)*\\|#{\\)" + 0 font-lock-variable-name-face t) ;; embedded document '(ruby-font-lock-docs 0 font-lock-comment-face t) @@ -772,8 +773,36 @@ An end of a defun is found by moving forward from the beginning of one." '("^\\s *def\\s +\\([^( ]+\\)" 1 font-lock-function-name-face) ;; symbols - '("\\(^\\|[^:]\\)\\(:\\([-+/%&|^~`]\\|\\*\\*?\\|<\\(<\\|=>?\\)?\\|>[>=]?\\|===?\\|=~\\|\\[\\]\\|\\(\\w\\|_\\)+\\([!?=]\\|\\b\\)\\)\\)" - 2 font-lock-reference-face)) + '("\\(^\\|[^:]\\)\\(:\\([-+/%&|^~`]\\|\\*\\*?\\|<\\(<\\|=>?\\)?\\|>[>=]?\\|===?\\|=~\\|\\[\\]\\|\\(\\w\\|_\\)+\\([!?=]\\|\\b\\)\\|#{[^}\n\\\\]*\\(\\\\.[^}\n\\\\]*\\)*}\\)\\)" + 2 font-lock-reference-face) + ;; strings + ;; %Q! ! + '("[[\\s <+(,]%[rqQ]?\\(\\([^a-zA-Z0-9 \n]\\)[^\\2\n\\\\]*\\(\\\\.[^\\2\n\\\\]*\\)*\\2\\)" + 1 font-lock-string-face t) + ;; '...' + '("[[\\s <+(,]\\('[^'\n\\\\]*\\(\\\\.[^'\n\\\\]*\\)*'\\)" + 1 font-lock-string-face t) + ;; "..." + '("[[\\s <+(,]\\(\"[^\"\n\\\\]*\\(\\\\.[^\"\n\\\\]*\\)*\"\\)" + 1 font-lock-string-face t) + ;; `...` + '("[\\s <+(,]\\(`[^`\n\\\\]*\\(\\\\.[^`\n\\\\]*\\)*`\\)" + 1 font-lock-warning-face t) + ;; %x!...! + '("[\\s <+(,]%x\\(\\([^a-zA-Z0-9 \n]\\)[^\\2\n\\]*\\(\\\\.[^\\2\n\\]*\\)*\\2\\)" + 1 font-lock-warning-face t) + ;; regexps + '("\\(^\\|[=(,~?:]\\|\\(^\\|\\s \\)\\(if\\|elsif\\|unless\\|while\\|until\\|when\\|and\\|or\\|&&\\|||\\)\\|\\.g?sub!?\\)\\s *\\(/[^/\n\\\\]*\\(\\\\.[^/\n\\\\]*\\)*/\\([iop]*\\)\\)" + (4 font-lock-string-face t) + (6 font-lock-constant-face t)) + '("\\(/[^/\n\\\\]*\\(\\\\.[^/\n\\\\]*\\)*/\\)\\s *[=!][=~]" + 1 font-lock-string-face t) + ;; expression expansion + '("#{[^}\n\\\\]*\\(\\\\.[^}\n\\\\]*\\)*}" + 0 font-lock-variable-name-face t) + ;; comment + '("^\\s *\\([^#\n'\"%/]\\|'[^'\n\\]*\\(\\\\.[^'\n\\]*\\)*'\\|\"[^\"\n\\]*\\(\\\\.[^\"\n\\]*\\)*\"\\|%[rqQx]?\\([^a-zA-Z0-9 \n]\\)[^\\4\n\\]*\\(\\\\.[^\\4\n\\]*\\)*\\4\\|/[^/\n\\]*\\(\\\\.[^/\n\\]\\)*/\\|#{[^}\\\\]*\\(\\\\.[^}\\\\]*\\)*}\\)*\\(#\\([^{\n].*\\|$\\)\\)" + 8 font-lock-comment-face t)) "*Additional expressions to highlight in ruby mode.")) ((featurep 'hilit19) diff --git a/numeric.c b/numeric.c index 027ee6366b..bf3f46279f 100644 --- a/numeric.c +++ b/numeric.c @@ -17,8 +17,7 @@ #include #endif -static ID coerce; -static ID to_i; +static ID id_coerce, id_to_i, id_div; VALUE rb_cNumeric; VALUE rb_cFloat; @@ -47,7 +46,7 @@ static VALUE coerce_body(x) VALUE *x; { - return rb_funcall(x[1], coerce, 1, x[0]); + return rb_funcall(x[1], id_coerce, 1, x[0]); } static VALUE @@ -119,7 +118,7 @@ static VALUE num_div(x, y) VALUE x, y; { - return rb_funcall(x, '/', 1, y); + return rb_funcall(x, id_div, 1, y); } static VALUE @@ -128,7 +127,7 @@ num_divmod(x, y) { VALUE div, mod; - div = rb_funcall(x, '/', 1, y); + div = rb_funcall(x, div, 1, y); if (TYPE(div) == T_FLOAT) { double d = floor(RFLOAT(div)->value); @@ -1535,8 +1534,9 @@ Init_Numeric() /* allow divide by zero -- Inf */ fpsetmask(fpgetmask() & ~(FP_X_DZ|FP_X_INV|FP_X_OFL)); #endif - coerce = rb_intern("coerce"); - to_i = rb_intern("to_i"); + id_coerce = rb_intern("coerce"); + id_to_i = rb_intern("to_i"); + id_div = rb_intern("div"); rb_eZeroDivError = rb_define_class("ZeroDivisionError", rb_eStandardError); rb_eFloatDomainError = rb_define_class("FloatDomainError", rb_eRangeError); @@ -1550,7 +1550,7 @@ Init_Numeric() rb_define_method(rb_cNumeric, "-@", num_uminus, 0); rb_define_method(rb_cNumeric, "===", num_equal, 1); rb_define_method(rb_cNumeric, "eql?", num_eql, 1); - rb_define_method(rb_cNumeric, "div", num_div, 1); + rb_define_method(rb_cNumeric, "/", num_div, 1); rb_define_method(rb_cNumeric, "divmod", num_divmod, 1); rb_define_method(rb_cNumeric, "modulo", num_modulo, 1); rb_define_method(rb_cNumeric, "remainder", num_remainder, 1); @@ -1675,3 +1675,4 @@ Init_Numeric() rb_define_method(rb_cFloat, "infinite?", flo_is_infinite_p, 0); rb_define_method(rb_cFloat, "finite?", flo_is_finite_p, 0); } + diff --git a/pack.c b/pack.c index 44a683a37f..caf829e22f 100644 --- a/pack.c +++ b/pack.c @@ -331,7 +331,7 @@ pack_pack(ary, fmt) static char *nul10 = "\0\0\0\0\0\0\0\0\0\0"; static char *spc10 = " "; char *p, *pend; - VALUE res, from, associates = 0; + VALUE res, from; char type; int items, len, idx; char *ptr; @@ -872,10 +872,7 @@ pack_pack(ary, fmt) StringValue(from); t = RSTRING(from)->ptr; } - if (!associates) { - associates = rb_ary_new(); - } - rb_ary_push(associates, from); + rb_str_associate(res, from); rb_str_buf_cat(res, (char*)&t, sizeof(char*)); } break; @@ -930,10 +927,6 @@ pack_pack(ary, fmt) break; } } - - if (associates) { - rb_str_associate(res, associates); - } return res; } @@ -1677,13 +1670,12 @@ pack_unpack(str, fmt) s += sizeof(char *); if (t) { - VALUE a, tmp; - VALUE *p, *pend; + VALUE a, *p, *pend; - p = RARRAY(a)->ptr; if (!(a = rb_str_associated(str))) { rb_raise(rb_eArgError, "no associated pointer"); } + p = RARRAY(a)->ptr; pend = p + RARRAY(a)->len; while (p < pend) { if (TYPE(*p) == T_STRING && RSTRING(*p)->ptr == t) { diff --git a/parse.y b/parse.y index dcad8436fb..cf9c9e07a4 100644 --- a/parse.y +++ b/parse.y @@ -4597,10 +4597,11 @@ cond0(node, logop) enum node_type type = nd_type(node); assign_in_cond(node); + if (logop) return node; + switch (type) { case NODE_DSTR: case NODE_STR: - if (logop) break; rb_warn("string literal in condition"); break; diff --git a/process.c b/process.c index 97b8faf997..261edb861d 100644 --- a/process.c +++ b/process.c @@ -227,11 +227,11 @@ pst_wcoredump(st) static st_table *pid_tbl; #endif -static int -rb_waitpid(pid, flags, st) +int +rb_waitpid(pid, st, flags) int pid; - int flags; int *st; + int flags; { int result; #ifndef NO_WAITPID @@ -326,50 +326,7 @@ waitall_each(key, value, data) #endif static VALUE -proc_wait() -{ - int pid, status; -#ifdef NO_WAITPID - struct wait_data data; - - if (pid_tbl) { - data.status = -1; - st_foreach(pid_tbl, wait_each, &data); - if (data.status != -1) { - last_status_set(data.status); - return INT2FIX(data.pid); - } - } - - while (1) { - TRAP_BEG; - pid = wait(&status); - TRAP_END; - if (pid >= 0) break; - if (errno == EINTR) { - rb_thread_schedule(); - continue; - } - rb_sys_fail(0); - } - last_status_set(status); -#else - if ((pid = rb_waitpid(-1, 0, &status)) < 0) - rb_sys_fail(0); -#endif - return INT2FIX(pid); -} - -static VALUE -proc_wait2() -{ - VALUE pid = proc_wait(); - - return rb_assoc_new(pid, rb_last_status); -} - -static VALUE -proc_waitpid(argc, argv) +proc_wait(argc, argv) int argc; VALUE *argv; { @@ -377,12 +334,17 @@ proc_waitpid(argc, argv) int pid, flags, status; flags = 0; - rb_scan_args(argc, argv, "11", &vpid, &vflags); - if (argc == 2 && !NIL_P(vflags)) { - flags = NUM2UINT(vflags); + rb_scan_args(argc, argv, "02", &vpid, &vflags); + if (argc == 0) { + pid = -1; } - - if ((pid = rb_waitpid(NUM2INT(vpid), flags, &status)) < 0) + else { + pid = NUM2INT(vpid); + if (argc == 2 && !NIL_P(vflags)) { + flags = NUM2UINT(vflags); + } + } + if ((pid = rb_waitpid(pid, &status, flags)) < 0) rb_sys_fail(0); if (pid == 0) { rb_last_status = Qnil; @@ -392,11 +354,11 @@ proc_waitpid(argc, argv) } static VALUE -proc_waitpid2(argc, argv) +proc_wait2(argc, argv) int argc; VALUE *argv; { - VALUE pid = proc_waitpid(argc, argv); + VALUE pid = proc_wait(argc, argv); if (NIL_P(pid)) return Qnil; return rb_assoc_new(pid, rb_last_status); } @@ -430,7 +392,7 @@ proc_waitall() #else rb_last_status = Qnil; for (pid = -1;;) { - pid = rb_waitpid(-1, 0, &status); + pid = rb_waitpid(-1, &status, 0); if (pid == -1) { if (errno == ECHILD) break; @@ -816,7 +778,7 @@ rb_syswait(pid) ifunc = signal(SIGINT, SIG_IGN); do { - i = rb_waitpid(pid, 0, &status); + i = rb_waitpid(pid, &status, 0); } while (i == -1 && errno == EINTR); #ifdef SIGHUP @@ -994,52 +956,36 @@ rb_f_sleep(argc, argv) } static VALUE -proc_getpgrp(argc, argv) - int argc; - VALUE *argv; +proc_getpgrp() { -#ifdef HAVE_GETPGRP int pgrp; -#ifndef GETPGRP_VOID - VALUE vpid; - int pid; - rb_scan_args(argc, argv, "01", &vpid); - pid = NIL_P(vpid)?0:NUM2INT(vpid); - pgrp = getpgrp(pid); -#else - rb_scan_args(argc, argv, "0"); +#if defined(HAVE_GETPGRP) && defined(GETPGRP_VOID) pgrp = getpgrp(); -#endif if (pgrp < 0) rb_sys_fail(0); return INT2FIX(pgrp); #else +# ifdef HAVE_GETPGID + pgrp = getpgid(0); + if (pgrp < 0) rb_sys_fail(0); + return INT2FIX(pgrp); +# else rb_notimplement(); +# endif #endif } static VALUE -proc_setpgrp(argc, argv) - int argc; - VALUE *argv; +proc_setpgrp() { -#ifdef HAVE_SETPGRP -#ifndef SETPGRP_VOID - VALUE pid, pgrp; - int ipid, ipgrp; - - rb_scan_args(argc, argv, "02", &pid, &pgrp); - - ipid = NIL_P(pid)?0:NUM2INT(pid); - ipgrp = NIL_P(pgrp)?0:NUM2INT(pgrp); - if (setpgrp(ipid, ipgrp) < 0) rb_sys_fail(0); -#else - rb_scan_args(argc, argv, "0"); +#if defined(HAVE_SETPGRP) && defined(SETPGRP_VOID) if (setpgrp() < 0) rb_sys_fail(0); -#endif - return INT2FIX(0); #else +# ifdef HAVE_SETPGID + if (setpgid(0, 0) < 0) rb_sys_fail(0); +# else rb_notimplement(); +# endif #endif } @@ -1328,11 +1274,11 @@ Init_process() rb_define_singleton_method(rb_mProcess, "exit!", rb_f_exit_bang, -1); rb_define_module_function(rb_mProcess, "kill", rb_f_kill, -1); #ifndef NT - rb_define_module_function(rb_mProcess, "wait", proc_wait, 0); - rb_define_module_function(rb_mProcess, "wait2", proc_wait2, 0); + rb_define_module_function(rb_mProcess, "wait", proc_wait, -1); + rb_define_module_function(rb_mProcess, "wait2", proc_wait2, -1); + rb_define_module_function(rb_mProcess, "waitpid", proc_wait, -1); + rb_define_module_function(rb_mProcess, "waitpid2", proc_wait2, -1); rb_define_module_function(rb_mProcess, "waitall", proc_waitall, 0); - rb_define_module_function(rb_mProcess, "waitpid", proc_waitpid, -1); - rb_define_module_function(rb_mProcess, "waitpid2", proc_waitpid2, -1); rb_cProcStatus = rb_define_class_under(rb_mProcess, "Status", rb_cObject); rb_undef_method(CLASS_OF(rb_cProcStatus), "new"); @@ -1357,8 +1303,8 @@ Init_process() rb_define_module_function(rb_mProcess, "ppid", get_ppid, 0); #endif /* ifndef NT */ - rb_define_module_function(rb_mProcess, "getpgrp", proc_getpgrp, -1); - rb_define_module_function(rb_mProcess, "setpgrp", proc_setpgrp, -1); + rb_define_module_function(rb_mProcess, "getpgrp", proc_getpgrp, 0); + rb_define_module_function(rb_mProcess, "setpgrp", proc_setpgrp, 0); rb_define_module_function(rb_mProcess, "getpgid", proc_getpgid, 1); rb_define_module_function(rb_mProcess, "setpgid", proc_setpgid, 2); diff --git a/signal.c b/signal.c index 2b1e99a17a..bdfa321789 100644 --- a/signal.c +++ b/signal.c @@ -292,7 +292,7 @@ posix_signal(signum, handler) sigact.sa_handler = handler; sigemptyset(&sigact.sa_mask); sigact.sa_flags = 0; -#ifdef SA_RESTART +#if defined(SA_RESTART) sigact.sa_flags |= SA_RESTART; /* SVR4, 4.3+BSD */ #endif #ifdef SA_NOCLDWAIT diff --git a/string.c b/string.c index 227f4f78bf..326b9626b1 100644 --- a/string.c +++ b/string.c @@ -202,7 +202,7 @@ void rb_str_associate(str, add) VALUE str, add; { - if (!FL_TEST(str, STR_NO_ORIG)) { + if (FL_TEST(str, STR_NO_ORIG|STR_ASSOC) != (STR_NO_ORIG|STR_ASSOC)) { if (RSTRING(str)->orig) { rb_str_modify(str); } @@ -216,7 +216,7 @@ VALUE rb_str_associated(str) VALUE str; { - if (!FL_TEST(str, STR_NO_ORIG|STR_ASSOC)) { + if (FL_TEST(str, STR_NO_ORIG|STR_ASSOC) != (STR_NO_ORIG|STR_ASSOC)) { return Qfalse; } return RSTRING(str)->orig; @@ -2648,7 +2648,7 @@ rb_f_chomp(argc, argv) } static VALUE -rb_str_strip_bang(str) +rb_str_lstrip_bang(str) VALUE str; { char *s, *t, *e; @@ -2659,27 +2659,63 @@ rb_str_strip_bang(str) /* remove spaces at head */ while (s < t && ISSPACE(*s)) s++; + RSTRING(str)->len = t-s; + if (s > RSTRING(str)->ptr) { + memmove(RSTRING(str)->ptr, s, RSTRING(str)->len); + RSTRING(str)->ptr[RSTRING(str)->len] = '\0'; + return str; + } +} + +static VALUE +rb_str_lstrip(str) + VALUE str; +{ + str = rb_str_dup(str); + rb_str_lstrip_bang(str); + return str; +} + +static VALUE +rb_str_rstrip_bang(str) + VALUE str; +{ + char *s, *t, *e; + + rb_str_modify(str); + s = RSTRING(str)->ptr; + e = t = s + RSTRING(str)->len; + /* remove trailing spaces */ t--; while (s <= t && ISSPACE(*t)) t--; t++; RSTRING(str)->len = t-s; - if (s > RSTRING(str)->ptr) { - char *p = RSTRING(str)->ptr; - - RSTRING(str)->ptr = ALLOC_N(char, RSTRING(str)->len+1); - memcpy(RSTRING(str)->ptr, s, RSTRING(str)->len); - RSTRING(str)->ptr[RSTRING(str)->len] = '\0'; - free(p); - } - else if (t < e) { + if (t < e) { RSTRING(str)->ptr[RSTRING(str)->len] = '\0'; + return str; } - else { - return Qnil; - } + return Qnil; +} +static VALUE +rb_str_rstrip(str) + VALUE str; +{ + str = rb_str_dup(str); + rb_str_rstrip_bang(str); + return str; +} + +static VALUE +rb_str_strip_bang(str) + VALUE str; +{ + VALUE l = rb_str_lstrip_bang(str); + VALUE r = rb_str_rstrip_bang(str); + + if (NIL_P(l) && NIL_P(r)) return Qnil; return str; } @@ -3015,12 +3051,17 @@ Init_String() rb_define_method(rb_cString, "chop", rb_str_chop, 0); rb_define_method(rb_cString, "chomp", rb_str_chomp, -1); rb_define_method(rb_cString, "strip", rb_str_strip, 0); + rb_define_method(rb_cString, "lstrip", rb_str_lstrip, 0); + rb_define_method(rb_cString, "rstrip", rb_str_rstrip, 0); rb_define_method(rb_cString, "sub!", rb_str_sub_bang, -1); rb_define_method(rb_cString, "gsub!", rb_str_gsub_bang, -1); rb_define_method(rb_cString, "strip!", rb_str_strip_bang, 0); rb_define_method(rb_cString, "chop!", rb_str_chop_bang, 0); rb_define_method(rb_cString, "chomp!", rb_str_chomp_bang, -1); + rb_define_method(rb_cString, "strip!", rb_str_strip_bang, 0); + rb_define_method(rb_cString, "lstrip!", rb_str_lstrip_bang, 0); + rb_define_method(rb_cString, "rstrip!", rb_str_rstrip_bang, 0); rb_define_method(rb_cString, "tr", rb_str_tr, 2); rb_define_method(rb_cString, "tr_s", rb_str_tr_s, 2); diff --git a/version.h b/version.h index c9948e2b27..ca3b759a61 100644 --- a/version.h +++ b/version.h @@ -1,4 +1,4 @@ #define RUBY_VERSION "1.7.1" -#define RUBY_RELEASE_DATE "2001-07-31" +#define RUBY_RELEASE_DATE "2001-08-06" #define RUBY_VERSION_CODE 171 -#define RUBY_RELEASE_CODE 20010731 +#define RUBY_RELEASE_CODE 20010806 -- cgit v1.2.3