From 96b40dff450df701200ea5edceb07f2ed847e3fd Mon Sep 17 00:00:00 2001 From: matz Date: Thu, 17 Feb 2000 07:11:22 +0000 Subject: [PATCH] 2000-02-17 git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@618 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 55 ++++++++++++++ array.c | 7 ++ configure | 15 +++- configure.in | 12 ++- defines.h | 2 + dir.c | 2 +- eval.c | 154 +++++++++++++++++++++------------------ ext/socket/getaddrinfo.c | 2 +- ext/socket/getnameinfo.c | 2 +- ext/socket/socket.c | 4 +- file.c | 8 +- hash.c | 7 ++ instruby.rb | 36 +++++---- io.c | 10 ++- lib/find.rb | 2 +- math.c | 6 +- missing/file.h | 34 ++++----- missing/strtod.c | 9 ++- numeric.c | 4 +- parse.y | 17 ++--- process.c | 13 ++-- regex.c | 6 +- ruby.c | 24 +++--- ruby.h | 3 + string.c | 11 +++ time.c | 8 +- version.h | 4 +- 27 files changed, 286 insertions(+), 171 deletions(-) diff --git a/ChangeLog b/ChangeLog index 0922c3854d..157b56584b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,58 @@ +Wed Feb 16 00:32:49 2000 Yukihiro Matsumoto + + * eval.c (method_arity): nd_rest is -1 for no rest argument. + + * process.c (proc_waitpid): returns nil when waitpid(2) returns 0. + +Tue Feb 15 01:47:00 2000 Yukihiro Matsumoto + + * process.c (rb_f_waitpid): pid_t should be signed. + +Mon Feb 14 13:59:01 2000 Yukihiro Matsumoto + + * parse.y (yylex): yylex yields wrong token for `:foo=~expr'. + + * ruby.c (load_file): exit if reading file is empty. + +Mon Feb 14 03:34:52 2000 Yukihiro Matsumoto + + * parse.y (yylex): `foo.bar=' should be <.><=>. + + * eval.c (rb_thread_restore_context): process according to + RESTORE_* is moved after longjmp(). + + * eval.c (thread_switch): new function to process RESTORE_*. + +Sun Feb 13 16:19:49 2000 WATANABE Hirofumi + + * ruby.c (require_libraries): don't access freed memory. + + * ruby.c (add_modules): ditto. + +Fri Feb 11 12:06:22 2000 Yukihiro Matsumoto + + * parse.y (parse_quotedwords): %w() need to split not only by mere + spaces, but by all whitespaces. + +Thu Feb 10 02:12:04 2000 Yukihiro Matsumoto + + * string.c (rb_str_index_m): did not support negative offset. + +Wed Feb 9 21:54:26 2000 Katsuyuki Komatsu + + * ext/socket/getaddrinfo.c: gcc --traditional support. + Rearrange headers to work AC_C_CONST. + * ext/socket/getnameinfo.c: ditto. + * ext/socket/socket.c: mswin32: use double instead of long long. + +Wed Feb 9 16:30:41 2000 Yukihiro Matsumoto + + * numeric.c (num_coerce): should return [y, x]. + +Wed Feb 9 11:07:30 2000 Yukihiro Matsumoto + + * ruby.c (ruby_prog_init): loadpath structure changed. + Tue Feb 8 02:07:33 2000 Yukihiro Matsumoto * regex.c (re_search): optimize for \G at top. diff --git a/array.c b/array.c index d8a02a0fd9..7172baaa8d 100644 --- a/array.c +++ b/array.c @@ -51,6 +51,13 @@ rb_ary_modify(ary) rb_raise(rb_eSecurityError, "Insecure: can't modify array"); } +VALUE +rb_ary_freeze(ary) + VALUE ary; +{ + return rb_obj_freeze(ary); +} + static VALUE rb_ary_frozen_p(ary) VALUE ary; diff --git a/configure b/configure index 6b40c2fc32..af51fc3c6e 100644 --- a/configure +++ b/configure @@ -4966,16 +4966,24 @@ test "$program_suffix" != NONE && ri_suffix=$program_suffix RUBY_INSTALL_NAME="${ri_prefix}ruby${ri_suffix}" -RUBY_LIB_PATH="${prefix}/lib/ruby/${MAJOR}.${MINOR}" +RUBY_LIB_PREFIX="${prefix}/lib/ruby" +RUBY_LIB_PATH="${RUBY_LIB_PREFIX}/${MAJOR}.${MINOR}" +RUBY_SITE_LIB_PATH="${RUBY_LIB_PREFIX}/site_ruby" +RUBY_SITE_LIB_PATH2="${RUBY_SITE_LIB_PATH}/${MAJOR}.${MINOR}" + cat >> confdefs.h <> confdefs.h <> confdefs.h <> confdefs.h <> confdefs.h <next; } - if (ruby_dyna_vars->id == 0) { + if (ruby_dyna_vars && ruby_dyna_vars->id == 0) { rb_gc_force_recycle((VALUE)ruby_dyna_vars); } } @@ -3720,7 +3720,7 @@ rb_f_missing(argc, argv, obj) if (argc == 0) rb_raise(rb_eArgError, "no id given"); - id = FIX2INT(argv[0]); + id = NUM2INT(argv[0]); argc--; argv++; switch (TYPE(obj)) { @@ -5789,7 +5789,7 @@ proc_arity(proc) int n; Data_Get_Struct(proc, struct BLOCK, data); - if (data->var == 0) return FIX2INT(-1); + if (data->var == 0) return INT2FIX(-1); switch (nd_type(data->var)) { default: return INT2FIX(-2); @@ -5986,7 +5986,7 @@ method_arity(method) body = body->nd_head; if (!body) return INT2FIX(0); n = body->nd_cnt; - if (body->nd_rest) n = -n-1; + if (body->nd_rest >= 0) n = -n-1; return INT2FIX(n); } } @@ -6261,13 +6261,30 @@ rb_thread_check(data) return (thread_t)RDATA(data)->data; } +static int th_raise_argc; +static VALUE th_raise_argv[2]; +static char *th_raise_file; +static int th_raise_line; +static VALUE th_cmd; +static int th_sig; +static char *th_signm; + +#define RESTORE_NORMAL 1 +#define RESTORE_FATAL 2 +#define RESTORE_INTERRUPT 3 +#define RESTORE_TRAP 4 +#define RESTORE_RAISE 5 +#define RESTORE_SIGNAL 6 + static void rb_thread_save_context(th) thread_t th; { VALUE v; - int len = stack_length(); + int len; + + len = stack_length(); th->stk_len = 0; th->stk_pos = (rb_gc_stack_start<(VALUE*)&v)?rb_gc_stack_start :rb_gc_stack_start - len; @@ -6299,6 +6316,41 @@ rb_thread_save_context(th) th->line = ruby_sourceline; } +static int +thread_switch(n) + int n; +{ + switch (n) { + case 0: + return 0; + case RESTORE_FATAL: + JUMP_TAG(TAG_FATAL); + break; + case RESTORE_INTERRUPT: + rb_interrupt(); + break; + case RESTORE_TRAP: + rb_trap_eval(th_cmd, th_sig); + errno = EINTR; + break; + case RESTORE_RAISE: + ruby_frame->last_func = 0; + ruby_sourcefile = th_raise_file; + ruby_sourceline = th_raise_line; + rb_f_raise(th_raise_argc, th_raise_argv); + break; + case RESTORE_SIGNAL: + rb_raise(rb_eSignal, "SIG%s", th_signm); + break; + case RESTORE_NORMAL: + default: + return 1; + } +} + +#define THREAD_SAVE_CONTEXT(th) \ + (rb_thread_save_context(th),thread_switch(setjmp((th)->context))) + static void rb_thread_restore_context _((thread_t,int)); static void @@ -6312,21 +6364,6 @@ stack_extend(th, exit) rb_thread_restore_context(th, exit); } -static int th_raise_argc; -static VALUE th_raise_argv[2]; -static char *th_raise_file; -static int th_raise_line; -static VALUE th_cmd; -static int th_sig; -static char *th_signm; - -#define RESTORE_NORMAL 0 -#define RESTORE_FATAL 1 -#define RESTORE_INTERRUPT 2 -#define RESTORE_TRAP 3 -#define RESTORE_RAISE 4 -#define RESTORE_SIGNAL 5 - static void rb_thread_restore_context(th, exit) thread_t th; @@ -6373,35 +6410,7 @@ rb_thread_restore_context(th, exit) rb_lastline_set(tmp->last_line); rb_backref_set(tmp->last_match); - switch (ex) { - case RESTORE_FATAL: - JUMP_TAG(TAG_FATAL); - break; - - case RESTORE_INTERRUPT: - rb_interrupt(); - break; - - case RESTORE_TRAP: - rb_trap_eval(th_cmd, th_sig); - errno = EINTR; - break; - - case RESTORE_SIGNAL: - rb_raise(rb_eSignal, "SIG%s", th_signm); - break; - - case RESTORE_RAISE: - ruby_frame->last_func = 0; - ruby_sourcefile = th_raise_file; - ruby_sourceline = th_raise_line; - rb_f_raise(th_raise_argc, th_raise_argv); - break; - - case RESTORE_NORMAL: - default: - longjmp(tmp->context, 1); - } + longjmp(tmp->context, ex); } static void @@ -6639,8 +6648,7 @@ rb_thread_schedule() /* context switch */ if (curr == curr_thread) { - rb_thread_save_context(curr); - if (setjmp(curr->context)) { + if (THREAD_SAVE_CONTEXT(curr)) { return; } } @@ -7209,15 +7217,13 @@ rb_thread_create_0(fn, arg, klass) scope_dup(ruby_scope); FL_SET(ruby_scope, SCOPE_SHARED); - rb_thread_save_context(curr_thread); - if (setjmp(curr_thread->context)) { + if (THREAD_SAVE_CONTEXT(curr_thread)) { return thread; } PUSH_TAG(PROT_THREAD); if ((state = EXEC_TAG()) == 0) { - rb_thread_save_context(th); - if (setjmp(th->context) == 0) { + if (THREAD_SAVE_CONTEXT(th) == 0) { curr_thread = th; th->result = (*fn)(arg, th); } @@ -7384,8 +7390,7 @@ rb_thread_interrupt() if (curr_thread == main_thread) { rb_interrupt(); } - rb_thread_save_context(curr_thread); - if (setjmp(curr_thread->context)) { + if (THREAD_SAVE_CONTEXT(curr_thread)) { return; } curr_thread = main_thread; @@ -7403,8 +7408,7 @@ rb_thread_signal_raise(sig) rb_raise(rb_eSignal, "SIG%s", sig); } rb_thread_ready(main_thread); - rb_thread_save_context(curr_thread); - if (setjmp(curr_thread->context)) { + if (THREAD_SAVE_CONTEXT(curr_thread)) { return; } th_signm = sig; @@ -7417,6 +7421,7 @@ rb_thread_trap_eval(cmd, sig) VALUE cmd; int sig; { +#if 0 rb_thread_critical = 0; if (!rb_thread_dead(curr_thread)) { rb_thread_ready(curr_thread); @@ -7424,14 +7429,26 @@ rb_thread_trap_eval(cmd, sig) return; } rb_thread_ready(main_thread); - rb_thread_save_context(curr_thread); - if (setjmp(curr_thread->context)) { + if (THREAD_SAVE_CONTEXT(curr_thread)) { return; } th_cmd = cmd; th_sig = sig; curr_thread = main_thread; rb_thread_restore_context(curr_thread, RESTORE_TRAP); +#else + rb_thread_critical = 0; + if (!rb_thread_dead(curr_thread)) { + if (THREAD_SAVE_CONTEXT(curr_thread)) { + return; + } + } + rb_thread_ready(main_thread); + th_cmd = cmd; + th_sig = sig; + curr_thread = main_thread; + rb_thread_restore_context(curr_thread, RESTORE_TRAP); +#endif } static VALUE @@ -7442,17 +7459,15 @@ rb_thread_raise(argc, argv, thread) { thread_t th = rb_thread_check(thread); - if (rb_thread_dead(th)) return thread; + if (rb_thread_dead(th)) return Qnil; if (curr_thread == th) { rb_f_raise(argc, argv); } - if (th->safe < 4) { + if (ruby_safe_level > th->safe) { rb_secure(4); } - if (curr_thread->status != THREAD_KILLED) - rb_thread_save_context(curr_thread); - if (setjmp(curr_thread->context)) { + if (THREAD_SAVE_CONTEXT(curr_thread)) { return thread; } @@ -7613,8 +7628,7 @@ rb_callcc(self) for (tag=prot_tag; tag; tag=tag->prev) { scope_dup(tag->scope); } - rb_thread_save_context(th); - if (setjmp(th->context)) { + if (THREAD_SAVE_CONTEXT(th)) { return th->result; } else { @@ -7793,7 +7807,7 @@ static VALUE catch_i(tag) ID tag; { - return rb_funcall(Qnil, rb_intern("catch"), 0, FIX2INT(tag)); + return rb_funcall(Qnil, rb_intern("catch"), 0, INT2FIX(tag)); } VALUE @@ -7846,7 +7860,7 @@ rb_throw(tag, val) VALUE argv[2]; ID t = rb_intern(tag); - argv[0] = FIX2INT(t); + argv[0] = INT2FIX(t); argv[1] = val; rb_f_throw(2, argv); } diff --git a/ext/socket/getaddrinfo.c b/ext/socket/getaddrinfo.c index d99ad12506..0b9d9b6afc 100644 --- a/ext/socket/getaddrinfo.c +++ b/ext/socket/getaddrinfo.c @@ -38,6 +38,7 @@ * - PF_UNSPEC case would be handled in getipnodebyname() with the AI_ALL flag. */ +#include "config.h" #include #ifndef NT #include @@ -66,7 +67,6 @@ #include #endif -#include "config.h" #include "addrinfo.h" #include "sockport.h" diff --git a/ext/socket/getnameinfo.c b/ext/socket/getnameinfo.c index 2fbb8d8037..60bd71bac6 100644 --- a/ext/socket/getnameinfo.c +++ b/ext/socket/getnameinfo.c @@ -34,6 +34,7 @@ * but INRIA implementation returns EAI_xxx defined for getaddrinfo(). */ +#include "config.h" #include #ifndef NT #include @@ -60,7 +61,6 @@ #include #endif -#include "config.h" #include "addrinfo.h" #include "sockport.h" diff --git a/ext/socket/socket.c b/ext/socket/socket.c index 0a61160e99..e7d2300b18 100644 --- a/ext/socket/socket.c +++ b/ext/socket/socket.c @@ -86,7 +86,7 @@ int Rconnect(); * RFC 2553: protocol-independent placeholder for socket addresses */ #define _SS_MAXSIZE 128 -#define _SS_ALIGNSIZE (sizeof(long long)) +#define _SS_ALIGNSIZE (sizeof(double)) #define _SS_PAD1SIZE (_SS_ALIGNSIZE - sizeof(unsigned char) * 2) #define _SS_PAD2SIZE (_SS_MAXSIZE - sizeof(unsigned char) * 2 - \ _SS_PAD1SIZE - _SS_ALIGNSIZE) @@ -99,7 +99,7 @@ struct sockaddr_storage { unsigned short ss_family; #endif char __ss_pad1[_SS_PAD1SIZE]; - long long __ss_align; /* force desired structure storage alignment */ + double __ss_align; /* force desired structure storage alignment */ char __ss_pad2[_SS_PAD2SIZE]; }; #endif diff --git a/file.c b/file.c index 47d5274d8e..51c00a5958 100644 --- a/file.c +++ b/file.c @@ -1077,7 +1077,7 @@ static VALUE rb_file_s_symlink(obj, from, to) VALUE obj, from, to; { -#if !defined(MSDOS) && !defined(NT) && !defined(__EMX__) +#if !defined(MSDOS) && !defined(NT) && !defined(__EMX__) && !defined(riscos) Check_SafeStr(from); Check_SafeStr(to); @@ -1094,7 +1094,7 @@ static VALUE rb_file_s_readlink(obj, path) VALUE obj, path; { -#if !defined(MSDOS) && !defined(NT) && !defined(__EMX__) +#if !defined(MSDOS) && !defined(NT) && !defined(__EMX__) && !defined(riscos) char buf[MAXPATHLEN]; int cc; @@ -2026,7 +2026,7 @@ rb_path_check(path) return 1; } -#ifdef __MACOS__ +#if defined(__MACOS__) || defined(riscos) static int is_macos_native_path(path) const char *path; @@ -2045,7 +2045,7 @@ rb_find_file(file) VALUE fname; char *path; -#ifdef __MACOS__ +#if defined(__MACOS__) || defined(riscos) if (is_macos_native_path(file)) { FILE *f; diff --git a/hash.c b/hash.c index 4ead5862cc..ea42674ecb 100644 --- a/hash.c +++ b/hash.c @@ -34,6 +34,13 @@ rb_hash_modify(hash) rb_raise(rb_eSecurityError, "Insecure: can't modify hash"); } +VALUE +rb_hash_freeze(hash) + VALUE hash; +{ + return rb_obj_freeze(hash); +} + VALUE rb_cHash; static VALUE envtbl; diff --git a/instruby.rb b/instruby.rb index 52c7c2397f..7920e82fec 100644 --- a/instruby.rb +++ b/instruby.rb @@ -15,12 +15,17 @@ if ENV["prefix"] else prefix = CONFIG["prefix"] end + ruby_install_name = CONFIG["ruby_install_name"] +version = "/"+CONFIG["MAJOR"]+"."+CONFIG["MINOR"] +arch = version+"/"+CONFIG["arch"] + bindir = destdir+CONFIG["bindir"] libdir = destdir+CONFIG["libdir"] -#pkglibdir = libdir + "/" + ruby_install_name+"/"+CONFIG["MAJOR"]+"."+CONFIG["MINOR"] -pkglibdir = libdir + "/ruby/"+CONFIG["MAJOR"]+"."+CONFIG["MINOR"] -archdir = pkglibdir + "/" + CONFIG["arch"] +rubydir = libdir+"/ruby" +rubylibdir = rubydir+version +archlibdir = rubydir+arch +sitelibdir = rubydir+"/site_ruby"+version mandir = destdir+CONFIG["mandir"] + "/man1" wdir = Dir.getwd @@ -47,17 +52,16 @@ if File.exist? CONFIG["LIBRUBY_SO"] end end Dir.chdir wdir -File.makedirs pkglibdir, true -File.makedirs archdir, true -File.makedirs pkglibdir+"/site_ruby", true -File.makedirs pkglibdir+"/site_ruby/"+CONFIG["arch"], true +File.makedirs rubylibdir, true +File.makedirs archlibdir, true +File.makedirs sitelibdir, true if RUBY_PLATFORM =~ /cygwin/ and File.exist? "import.h" - File.install "import.h", archdir, 0644, true + File.install "import.h", archlibdir, 0644, true end if RUBY_PLATFORM =~ /-aix/ - File.install "ruby.imp", archdir, 0644, true + File.install "ruby.imp", archlibdir, 0644, true end Dir.chdir "ext" @@ -72,20 +76,20 @@ Find.find("lib") do |f| end for f in Dir["*.h"] - File.install f, archdir, 0644, true + File.install f, archlibdir, 0644, true end if RUBY_PLATFORM =~ /mswin32/ - File.makedirs archdir + "/win32", true - File.install "win32/win32.h", archdir + "/win32", 0644, true + File.makedirs archlibdir + "/win32", true + File.install "win32/win32.h", archlibdir + "/win32", 0644, true if File.exist? wdir+'/rubymw.lib' - File.install wdir+'/rubymw.lib', archdir, 0644, true + File.install wdir+'/rubymw.lib', archlibdir, 0644, true end end -File.install wdir+'/'+CONFIG['LIBRUBY_A'], archdir, 0644, true +File.install wdir+'/'+CONFIG['LIBRUBY_A'], archlibdir, 0644, true File.makedirs mandir, true File.install "ruby.1", mandir, 0644, true Dir.chdir wdir -File.install "config.h", archdir, 0644, true -File.install "rbconfig.rb", archdir, 0644, true +File.install "config.h", archlibdir, 0644, true +File.install "rbconfig.rb", archlibdir, 0644, true # vi:set sw=2: diff --git a/io.c b/io.c index cb81afdcf0..30f35dc7de 100644 --- a/io.c +++ b/io.c @@ -1608,8 +1608,8 @@ rb_file_s_open(argc, argv, klass) path = RSTRING(fname)->ptr; if (FIXNUM_P(vmode)) { - int flags = FIX2INT(vmode); - int fmode = NIL_P(perm) ? 0666 : FIX2INT(perm); + int flags = NUM2INT(vmode); + int fmode = NIL_P(perm) ? 0666 : NUM2INT(perm); file = rb_file_sysopen_internal(klass, path, flags, fmode); } @@ -1649,7 +1649,7 @@ rb_f_open(argc, argv) mode = "r"; } else if (FIXNUM_P(pmode)) { - mode = rb_io_flags_mode(FIX2INT(pmode)); + mode = rb_io_flags_mode(NUM2INT(pmode)); } else { int len; @@ -1661,6 +1661,7 @@ rb_f_open(argc, argv) } port = pipe_open(RSTRING(pname)->ptr+1, mode); + if (!rb_iterator_p()) return port; if (NIL_P(port)) { rb_yield(port); } @@ -3396,4 +3397,7 @@ Init_IO() #ifdef O_BINARY rb_file_const("BINARY", INT2FIX(O_BINARY)); #endif +#ifdef O_SYNC + rb_file_const("BINARY", INT2FIX(O_SYNC)); +#endif } diff --git a/lib/find.rb b/lib/find.rb index 469dca80aa..9fb012902c 100644 --- a/lib/find.rb +++ b/lib/find.rb @@ -16,7 +16,7 @@ module Find d = Dir.open(file) begin for f in d - next if f =~ /^\.\.?$/ + next if f =~ /\A\.\.?\z/ if File::ALT_SEPARATOR and file =~ /^([\/\\]|[A-Za-z]:[\/\\]?)$/ then f = file + f elsif file == "/" then diff --git a/math.c b/math.c index 39bc48aa1c..85e85bc75b 100644 --- a/math.c +++ b/math.c @@ -22,11 +22,11 @@ VALUE rb_mMath; } static VALUE -math_atan2(obj, x, y) +math_atan2(obj, y, x) VALUE obj, x, y; { - Need_Float2(x, y); - return rb_float_new(atan2(RFLOAT(x)->value, RFLOAT(y)->value)); + Need_Float2(y, x); + return rb_float_new(atan2(RFLOAT(y)->value, RFLOAT(x)->value)); } static VALUE diff --git a/missing/file.h b/missing/file.h index 79f5f65f5d..b6cec8eb05 100644 --- a/missing/file.h +++ b/missing/file.h @@ -1,31 +1,23 @@ /* This is file FILE.H */ -/* -** Copyright (C) 1991 DJ Delorie, 24 Kirsten Ave, Rochester NH 03867-2954 -** -** This file is distributed under the terms listed in the document -** "copying.dj", available from DJ Delorie at the address above. -** A copy of "copying.dj" should accompany this file; if not, a copy -** should be available from where this file was obtained. This file -** may not be distributed without a verbatim copy of "copying.dj". -** -** This file is distributed WITHOUT ANY WARRANTY; without even the implied -** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. -*/ #ifndef _FILE_H_ #define _FILE_H_ #include -#define L_SET 0 -#define L_CURR 1 -#define L_INCR 1 -#define L_XTND 2 +#ifndef L_SET +# define L_SET 0 /* seek from beginning. */ +# define L_CURR 1 /* seek from current position. */ +# define L_INCR 1 /* ditto. */ +# define L_XTND 2 /* seek from end. */ +#endif - -#define F_OK 0 /* does file exist */ -#define X_OK 1 /* is it executable by caller */ -#define W_OK 2 /* is it writable by caller */ -#define R_OK 4 /* is it readable by caller */ +# ifndef R_OK +# define R_OK 4 /* test whether readable. */ +# define W_OK 2 /* test whether writable. */ +# define X_OK 1 /* test whether execubale. */ +# define F_OK 0 /* test whether exist. */ +# endif +#endif #endif diff --git a/missing/strtod.c b/missing/strtod.c index e052cbc067..fdccd48081 100644 --- a/missing/strtod.c +++ b/missing/strtod.c @@ -6,8 +6,13 @@ * Copyright (c) 1988-1993 The Regents of the University of California. * Copyright (c) 1994 Sun Microsystems, Inc. * - * See the file "license.terms" for information on usage and redistribution - * of this file, and for a DISCLAIMER OF ALL WARRANTIES. + * Permission to use, copy, modify, and distribute this + * software and its documentation for any purpose and without + * fee is hereby granted, provided that the above copyright + * notice appear in all copies. The University of California + * makes no representations about the suitability of this + * software for any purpose. It is provided "as is" without + * express or implied warranty. * * RCS: @(#) $Id$ */ diff --git a/numeric.c b/numeric.c index 0169621623..a16863f6df 100644 --- a/numeric.c +++ b/numeric.c @@ -43,8 +43,8 @@ num_coerce(x, y) VALUE x, y; { if (CLASS_OF(x) == CLASS_OF(y)) - return rb_assoc_new(x, y); - return rb_assoc_new(rb_Float(x), rb_Float(y)); + return rb_assoc_new(y, x); + return rb_assoc_new(rb_Float(y), rb_Float(x)); } static VALUE diff --git a/parse.y b/parse.y index 5c8e07058c..254c974fcf 100644 --- a/parse.y +++ b/parse.y @@ -2430,7 +2430,7 @@ parse_quotedwords(term, paren) strstart = ruby_sourceline; newtok(); - while ((c = nextc()) == ' ') + while (c = nextc(),ISSPACE(c)) ; /* skip preceding spaces */ pushback(c); while ((c = nextc()) != term || nest > 0) { @@ -2455,14 +2455,13 @@ parse_quotedwords(term, paren) case '\\': c = '\\'; break; - case ' ': - tokadd(' '); - break; default: - tokadd('\\'); + if (ISSPACE(c)) + tokadd('\\'); + tokadd(c); } } - else if (c == ' ') { + else if (ISSPACE(c)) { NODE *str; tokfix(); @@ -2470,7 +2469,7 @@ parse_quotedwords(term, paren) newtok(); if (!qwords) qwords = NEW_LIST(str); else list_append(qwords, str); - while ((c = nextc()) == ' ') + while (c = nextc(),ISSPACE(c)) ; /* skip continuous spaces */ pushback(c); continue; @@ -3414,8 +3413,8 @@ yylex() result = tFID; } else { - if (lex_state == EXPR_FNAME || lex_state == EXPR_DOT) { - if ((c = nextc()) == '=' && !peek('=')) { + if (lex_state == EXPR_FNAME) { + if ((c = nextc()) == '=' && !peek('=') && !peek('~')) { result = tIDENTIFIER; tokadd(c); } diff --git a/process.c b/process.c index f68753b1eb..38c72f5a6a 100644 --- a/process.c +++ b/process.c @@ -160,7 +160,7 @@ wait_each(key, value, data) #endif static VALUE -rb_f_wait() +proc_wait() { int pid, state; #ifdef NO_WAITPID @@ -189,16 +189,17 @@ rb_f_wait() } static VALUE -rb_f_waitpid(obj, vpid, vflags) +proc_waitpid(obj, vpid, vflags) VALUE obj, vpid, vflags; { int pid, flags, status; if (NIL_P(vflags)) flags = 0; - else flags = FIX2UINT(vflags); + else flags = NUM2UINT(vflags); - if ((pid = rb_waitpid(FIX2UINT(vpid), flags, &status)) < 0) + if ((pid = rb_waitpid(NUM2INT(vpid), flags, &status)) < 0) rb_sys_fail(0); + if (pid == 0) return Qnil; return INT2FIX(pid); } @@ -1056,8 +1057,8 @@ Init_process() rb_define_module_function(rb_mProcess, "kill", rb_f_kill, -1); #endif #ifndef NT - rb_define_module_function(rb_mProcess, "wait", rb_f_wait, 0); - rb_define_module_function(rb_mProcess, "waitpid", rb_f_waitpid, 2); + rb_define_module_function(rb_mProcess, "wait", proc_wait, 0); + rb_define_module_function(rb_mProcess, "waitpid", proc_waitpid, 2); #ifndef USE_CWGUSI rb_define_module_function(rb_mProcess, "pid", get_pid, 0); diff --git a/regex.c b/regex.c index 21aa900960..0ee2b066d3 100644 --- a/regex.c +++ b/regex.c @@ -3721,12 +3721,12 @@ re_match(bufp, string_arg, size, pos, regs) cc = c = (unsigned char)translate[c]; not = is_in_list(c, p); + if (!not && cc != c) { + part = not = is_in_list(cc, p); + } if (*(p - 1) == (unsigned char)charset_not) { not = !not; } - else if (!not && cc != c) { - part = not = is_in_list(cc, p); - } if (!not) goto fail; p += 1 + *p + 2 + EXTRACT_UNSIGNED(&p[1 + *p])*8; diff --git a/ruby.c b/ruby.c index 4f87d74818..22bc2b3629 100644 --- a/ruby.c +++ b/ruby.c @@ -108,13 +108,6 @@ NULL printf("\n %s", *p++); } -#ifndef RUBY_LIB -#define RUBY_LIB "/usr/local/lib/ruby" -#endif -#ifndef RUBY_SITE_LIB -#define RUBY_SITE_LIB "/usr/local/lib/site_ruby" -#endif - extern VALUE rb_load_path; #define STATIC_FILE_LENGTH 255 @@ -215,7 +208,7 @@ addpath(path) } struct req_list { - const char *name; + char *name; struct req_list *next; } req_list_head; struct req_list *req_list_last = &req_list_head; @@ -227,7 +220,8 @@ add_modules(mod) struct req_list *list; list = ALLOC(struct req_list); - list->name = mod; + list->name = ALLOC_N(char, strlen(mod)+1); + strcpy(list->name, mod); list->next = 0; req_list_last->next = list; req_list_last = list; @@ -248,6 +242,7 @@ require_libraries() while (list) { rb_require(list->name); tmp = list->next; + free(list->name); free(list); list = tmp; } @@ -745,7 +740,11 @@ load_file(fname, script) } } } - else if (!NIL_P(c)) { + else if (NIL_P(c)) { + rb_io_close(f); + return; + } + else { rb_io_ungetc(f, c); } } @@ -930,17 +929,14 @@ ruby_prog_init() addpath(ruby_libpath()); #endif -#ifdef RUBY_ARCHLIB addpath(RUBY_ARCHLIB); -#endif #ifdef RUBY_THIN_ARCHLIB addpath(RUBY_THIN_ARCHLIB); #endif addpath(RUBY_SITE_LIB); -#ifdef RUBY_SITE_ARCHLIB + addpath(RUBY_SITE_LIB2); addpath(RUBY_SITE_ARCHLIB); -#endif #ifdef RUBY_SITE_THIN_ARCHLIB addpath(RUBY_SITE_THIN_ARCHLIB); #endif diff --git a/ruby.h b/ruby.h index 88eda6aa93..2862ae2887 100644 --- a/ruby.h +++ b/ruby.h @@ -115,10 +115,13 @@ typedef unsigned long ID; #define FIXNUM_FLAG 0x01 #define INT2FIX(i) (VALUE)(((long)(i))<<1 | FIXNUM_FLAG) +#define rb_fix_new(v) INT2FIX(v) VALUE rb_int2inum _((long)); #define INT2NUM(v) rb_int2inum(v) +#define rb_int_new(v) rb_int2inum(v) VALUE rb_uint2inum _((unsigned long)); #define UINT2NUM(v) rb_uint2inum(v) +#define rb_uint_new(v) rb_uint2inum(v) #define FIX2LONG(x) RSHIFT((long)x,1) #define FIX2ULONG(x) (((unsigned long)(x))>>1) diff --git a/string.c b/string.c index df483a2e1d..e48a1ec53d 100644 --- a/string.c +++ b/string.c @@ -340,6 +340,13 @@ rb_str_modify(str) RSTRING(str)->orig = 0; } +VALUE +rb_str_freeze(str) + VALUE str; +{ + return rb_obj_freeze(str); +} + VALUE rb_str_dup_frozen(str) VALUE str; @@ -561,6 +568,10 @@ rb_str_index_m(argc, argv, str) else { pos = 0; } + if (pos < 0) { + pos += RSTRING(str)->len; + if (pos < 0) return Qnil; + } switch (TYPE(sub)) { case T_REGEXP: diff --git a/time.c b/time.c index 5ea0f96f64..8f94549e74 100644 --- a/time.c +++ b/time.c @@ -394,7 +394,7 @@ time_cmp(time1, time2) i = FIX2LONG(time2); if (tobj1->tv.tv_sec == i) return INT2FIX(0); if (tobj1->tv.tv_sec > i) return INT2FIX(1); - return FIX2INT(-1); + return INT2FIX(-1); case T_FLOAT: { @@ -414,15 +414,15 @@ time_cmp(time1, time2) if (tobj1->tv.tv_sec == tobj2->tv.tv_sec) { if (tobj1->tv.tv_usec == tobj2->tv.tv_usec) return INT2FIX(0); if (tobj1->tv.tv_usec > tobj2->tv.tv_usec) return INT2FIX(1); - return FIX2INT(-1); + return INT2FIX(-1); } if (tobj1->tv.tv_sec > tobj2->tv.tv_sec) return INT2FIX(1); - return FIX2INT(-1); + return INT2FIX(-1); } i = NUM2LONG(time2); if (tobj1->tv.tv_sec == i) return INT2FIX(0); if (tobj1->tv.tv_sec > i) return INT2FIX(1); - return FIX2INT(-1); + return INT2FIX(-1); } static VALUE diff --git a/version.h b/version.h index f72af96121..fcdeb1cbc3 100644 --- a/version.h +++ b/version.h @@ -1,4 +1,4 @@ #define RUBY_VERSION "1.5.2" -#define RUBY_RELEASE_DATE "2000-02-08" +#define RUBY_RELEASE_DATE "2000-02-17" #define RUBY_VERSION_CODE 152 -#define RUBY_RELEASE_CODE 20000208 +#define RUBY_RELEASE_CODE 20000217