From e502549be1bea41406ccef0e819b0e9cb8cdb069 Mon Sep 17 00:00:00 2001 From: matz Date: Tue, 13 Mar 2001 05:45:13 +0000 Subject: * io.c (argf_seek_m): wrong calling sequence of rb_io_seek(). * parse.y (cond0): no special treatment of string literal in condition. * math.c: add acos, asin, atan, conh, sinh, tanh and hypot to Math. * configure.in: check hypot availablility. * missing/hypot.c: public domain rewrite of hypot. * parse.y (warn_unless_e_option): warning condition was wrong. * parse.y (warning_unless_e_option): ditto. * enum.c (enum_all): new method 'all?', which returns true if block returns true for all elements. * enum.c (enum_any): new method 'any?', which returns true if block retruns true for any of elements. * marshal.c (marshal_load): do not give warning unless explicitly set to verbose. * eval.c (rb_exit): give string value "exit" to SystemExit. * ruby.c (proc_options): -v should not print version if proc_options called via moreswitches(). * parse.y (stmt): while/until modifier must work for empty body. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@1241 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 52 ++++++++++++++++++++++++++++++++++++++++ MANIFEST | 1 + array.c | 4 ++-- configure.in | 2 +- dln.c | 6 ++--- enum.c | 58 ++++++++++++++++++++++++++++++++++++++++---- eval.c | 6 ++--- intern.h | 1 + io.c | 41 ++++++++++++++++++++++---------- lib/delegate.rb | 2 +- lib/mkmf.rb | 2 +- lib/profile.rb | 9 +++---- marshal.c | 2 +- math.c | 74 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ missing/hypot.c | 17 +++++++++++++ numeric.c | 2 +- object.c | 4 ++-- parse.y | 47 ++++++++++++------------------------ ruby.c | 3 ++- version.h | 4 ++-- 20 files changed, 266 insertions(+), 71 deletions(-) create mode 100644 missing/hypot.c diff --git a/ChangeLog b/ChangeLog index 3dd36ff543..cc974a811d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,15 +1,59 @@ +<<<<<<< ChangeLog +Tue Mar 13 14:41:16 2001 Yukihiro Matsumoto + + * io.c (argf_seek_m): wrong calling sequence of rb_io_seek(). + +Tue Mar 13 09:14:19 2001 Yukihiro Matsumoto + + * parse.y (cond0): no special treatment of string literal in + condition. + Mon Mar 12 18:59:38 2001 WATANABE Hirofumi * lib/mkmf.rb (create_makefile): save/restore $libs and $LIBPATH. +Sun Mar 11 18:13:34 2001 Masahiro Tanaka + + * math.c: add acos, asin, atan, conh, sinh, tanh and hypot to Math. + + * configure.in: check hypot availablility. + + * missing/hypot.c: public domain rewrite of hypot. + +Sun Mar 11 13:21:04 2001 Koji Arai + + * parse.y (warn_unless_e_option): warning condition was wrong. + + * parse.y (warning_unless_e_option): ditto. + Sun Mar 11 00:55:31 2001 WATANABE Hirofumi * lib/mkmf.rb (install_rb): fix handling of destination path. +Sat Mar 10 22:56:44 2001 Yukihiro Matsumoto + + * enum.c (enum_all): new method 'all?', which returns true if + block returns true for all elements. + + * enum.c (enum_any): new method 'any?', which returns true if + block retruns true for any of elements. + Sat Mar 10 02:34:18 2001 WATANABE Hirofumi * math.c (math_log, math_log10): use nan() instead of 0.0/0.0 on Cygwin. +Fri Mar 9 09:56:19 2001 Yukihiro Matsumoto + + * marshal.c (marshal_load): do not give warning unless explicitly + set to verbose. + +Fri Mar 9 02:07:53 2001 Yukihiro Matsumoto + + * eval.c (rb_exit): give string value "exit" to SystemExit. + + * ruby.c (proc_options): -v should not print version if + proc_options called via moreswitches(). + Thu Mar 8 17:45:19 2001 Minero Aoki * lib/net/protocol.rb: one write(2) per one line. @@ -19,6 +63,14 @@ Wed Mar 7 14:26:11 2001 WATANABE Hirofumi * math.c (math_log, math_log10): should return NaN if x < 0.0 on Cygwin. +Thu Mar 7 10:31:26 2001 Nobuyoshi Nakada + + * parse.y (stmt): while/until modifier must work for empty body. + +Tue Mar 6 22:53:58 2001 Kazuhiro Yoshida + + * ruby.c (ruby_set_argv): clear ARGV contents before adding args. + Tue Mar 6 10:50:29 2001 Yukihiro Matsumoto * parse.y (primary): rescue and ensure clauses should be allowed diff --git a/MANIFEST b/MANIFEST index c701e81a5d..d80ba8ac44 100644 --- a/MANIFEST +++ b/MANIFEST @@ -167,6 +167,7 @@ missing/dup2.c missing/file.h missing/finite.c missing/flock.c +missing/hypot.c missing/isinf.c missing/isnan.c missing/memcmp.c diff --git a/array.c b/array.c index 5695851f9c..4d3cd04a1c 100644 --- a/array.c +++ b/array.c @@ -1100,7 +1100,7 @@ rb_ary_delete_at(ary, pos) return del; } -VALUE +static VALUE rb_ary_delete_at_m(ary, pos) VALUE ary, pos; { @@ -1186,7 +1186,7 @@ rb_ary_replace_m(ary, ary2) return ary; } -static VALUE +VALUE rb_ary_clear(ary) VALUE ary; { diff --git a/configure.in b/configure.in index c24b7b7101..6a60e2c158 100644 --- a/configure.in +++ b/configure.in @@ -255,7 +255,7 @@ AC_FUNC_VFORK AC_FUNC_MEMCMP AC_REPLACE_FUNCS(dup2 memmove mkdir strcasecmp strncasecmp strerror strftime\ strchr strstr strtoul crypt flock vsnprintf\ - isinf isnan finite) + isinf isnan finite hypot) AC_CHECK_FUNCS(fmod killpg drand48 random wait4 waitpid syscall getcwd chroot\ truncate chsize times utimes fcntl lockf lstat symlink readlink\ setitimer setruid seteuid setreuid setresuid \ diff --git a/dln.c b/dln.c index 98b97affbe..11142275d2 100644 --- a/dln.c +++ b/dln.c @@ -84,9 +84,9 @@ int eaccess(); #ifndef FUNCNAME_PATTERN # if defined(__hp9000s300) || (defined(__NetBSD__) && !defined(__ELF__)) || defined(__BORLANDC__) || (defined(__FreeBSD__) && __FreeBSD__ < 3) || defined(__OpenBSD__) || defined(NeXT) || defined(__WATCOMC__) || defined(__APPLE__) -# define FUNCNAME_PATTERN "_Init_%.200s" +# define FUNCNAME_PATTERN "_Init_%s" # else -# define FUNCNAME_PATTERN "Init_%.200s" +# define FUNCNAME_PATTERN "Init_%s" # endif #endif @@ -1194,7 +1194,7 @@ aix_loaderror(const char *pathname) #define LOAD_ERRTAB_LEN (sizeof(load_errtab)/sizeof(load_errtab[0])) #define ERRBUF_APPEND(s) strncat(errbuf, s, sizeof(errbuf)-strlen(errbuf)-1) - snprintf(errbuf, 1024, "load failed - %.200s ", pathname); + snprintf(errbuf, 1024, "load failed - %s ", pathname); if (!loadquery(1, &message[0], sizeof(message))) ERRBUF_APPEND(strerror(errno)); diff --git a/enum.c b/enum.c index 19cfe913ca..56d69502a0 100644 --- a/enum.c +++ b/enum.c @@ -87,10 +87,10 @@ enum_find(argc, argv, obj) rb_gc_force_recycle((VALUE)memo); return memo->u1.value; } + rb_gc_force_recycle((VALUE)memo); if (!NIL_P(if_none)) { rb_eval_cmd(if_none, rb_ary_new2(0)); } - rb_gc_force_recycle((VALUE)memo); return Qnil; } @@ -147,7 +147,7 @@ collect_i(i, tmp) } static VALUE -enum_all(i, ary) +collect_all(i, ary) VALUE i, ary; { rb_ary_push(ary, i); @@ -161,7 +161,7 @@ enum_to_a(obj) VALUE ary; ary = rb_ary_new(); - rb_iterate(rb_each, obj, enum_all, ary); + rb_iterate(rb_each, obj, collect_all, ary); return ary; } @@ -173,7 +173,7 @@ enum_collect(obj) VALUE tmp; tmp = rb_ary_new(); - rb_iterate(rb_each, obj, rb_block_given_p() ? collect_i : enum_all, tmp); + rb_iterate(rb_each, obj, rb_block_given_p() ? collect_i : collect_all, tmp); return tmp; } @@ -203,6 +203,54 @@ enum_sort(obj) return rb_ary_sort(enum_to_a(obj)); } +static VALUE +all_i(i, memo) + VALUE i; + NODE *memo; +{ + if (!RTEST(rb_yield(i))) { + memo->u1.value = Qfalse; + rb_iter_break(); + } + return Qnil; +} + +static VALUE +enum_all(obj) + VALUE obj; +{ + NODE *memo = rb_node_newnode(NODE_MEMO, Qnil, 0, 0); + + memo->u1.value = Qtrue; + rb_iterate(rb_each, obj, all_i, (VALUE)memo); + rb_gc_force_recycle((VALUE)memo); + return memo->u1.value; +} + +static VALUE +any_i(i, memo) + VALUE i; + NODE *memo; +{ + if (RTEST(rb_yield(i))) { + memo->u1.value = Qtrue; + rb_iter_break(); + } + return Qnil; +} + +static VALUE +enum_any(obj) + VALUE obj; +{ + NODE *memo = rb_node_newnode(NODE_MEMO, Qnil, 0, 0); + + memo->u1.value = Qfalse; + rb_iterate(rb_each, obj, any_i, (VALUE)memo); + rb_gc_force_recycle((VALUE)memo); + return memo->u1.value; +} + static VALUE min_i(i, memo) VALUE i; @@ -358,6 +406,8 @@ Init_Enumerable() rb_define_method(rb_mEnumerable,"collect", enum_collect, 0); rb_define_method(rb_mEnumerable,"map", enum_collect, 0); rb_define_method(rb_mEnumerable,"inject", enum_inject, 1); + rb_define_method(rb_mEnumerable,"all?", enum_all, 0); + rb_define_method(rb_mEnumerable,"any?", enum_any, 0); rb_define_method(rb_mEnumerable,"min", enum_min, 0); rb_define_method(rb_mEnumerable,"max", enum_max, 0); rb_define_method(rb_mEnumerable,"member?", enum_member, 1); diff --git a/eval.c b/eval.c index ce09465634..cb892cd1d1 100644 --- a/eval.c +++ b/eval.c @@ -3315,7 +3315,7 @@ rb_exit(status) VALUE exit; exit_status = status; - exit = rb_exc_new(rb_eSystemExit, 0, 0); + exit = rb_exc_new2(rb_eSystemExit, "exit"); rb_iv_set(exit, "status", INT2NUM(status)); rb_exc_raise(exit); } @@ -4152,7 +4152,7 @@ stack_length(p) #endif if (p) *p = STACK_END; -#ifdef sparc +#ifdef __sparc__ return rb_gc_stack_start - STACK_END + 0x80; #else return (STACK_END < rb_gc_stack_start) ? rb_gc_stack_start - STACK_END @@ -6445,7 +6445,7 @@ block_pass(self, node) break; case TAG_BREAK: if (orphan) { - rb_raise(rb_eLocalJumpError, "retry from proc-closure"); + rb_raise(rb_eLocalJumpError, "break from proc-closure"); } break; case TAG_RETRY: diff --git a/intern.h b/intern.h index f1a0b70659..b83c077b67 100644 --- a/intern.h +++ b/intern.h @@ -41,6 +41,7 @@ VALUE rb_ary_sort _((VALUE)); VALUE rb_ary_sort_bang _((VALUE)); VALUE rb_ary_delete _((VALUE, VALUE)); VALUE rb_ary_delete_at _((VALUE, long)); +VALUE rb_ary_clear _((VALUE)); VALUE rb_ary_plus _((VALUE, VALUE)); VALUE rb_ary_concat _((VALUE, VALUE)); VALUE rb_ary_assoc _((VALUE, VALUE)); diff --git a/io.c b/io.c index 075c520b2a..9beb17f342 100644 --- a/io.c +++ b/io.c @@ -317,7 +317,23 @@ rb_io_tell(io) #endif static VALUE -rb_io_seek(argc, argv, io) +rb_io_seek(io, offset, whence) + VALUE io, offset; + int whence; +{ + OpenFile *fptr; + long pos; + + GetOpenFile(io, fptr); + pos = fseek(fptr->f, NUM2INT(offset), whence); + if (pos != 0) rb_sys_fail(fptr->path); + clearerr(fptr->f); + + return INT2FIX(0); +} + +static VALUE +rb_io_seek_m(argc, argv, io) int argc; VALUE *argv; VALUE io; @@ -331,12 +347,7 @@ rb_io_seek(argc, argv, io) if (argc == 1) whence = SEEK_SET; else whence = NUM2INT(ptrname); - GetOpenFile(io, fptr); - pos = fseek(fptr->f, NUM2INT(offset), whence); - if (pos != 0) rb_sys_fail(fptr->path); - clearerr(fptr->f); - - return INT2FIX(0); + return rb_io_seek(io, offset, whence); } static VALUE @@ -3148,7 +3159,7 @@ rb_io_s_read(argc, argv, io) arg.io = rb_io_open(RSTRING(fname)->ptr, "r"); if (NIL_P(arg.io)) return Qnil; if (!NIL_P(offset)) { - rb_io_seek(1, &offset, arg.io); + rb_io_seek(arg.io, offset, SEEK_SET); } return rb_ensure(io_s_read, (VALUE)&arg, rb_io_close, arg.io); } @@ -3167,9 +3178,13 @@ argf_tell() } static VALUE -argf_seek(self, offset, ptrname) - VALUE self, offset, ptrname; +argf_seek_m(argc, argv, self) + int argc; + VALUE *argv; + VALUE self; { + VALUE args[2]; + if (!next_argv()) { rb_raise(rb_eArgError, "no stream to seek"); } @@ -3177,7 +3192,7 @@ argf_seek(self, offset, ptrname) if (TYPE(current_file) != T_FILE) { return argf_forward(); } - return rb_io_seek(current_file, offset, ptrname); + return rb_io_seek_m(argc, argv, current_file); } static VALUE @@ -3490,7 +3505,7 @@ Init_IO() rb_define_method(rb_cIO, "<<", rb_io_addstr, 1); rb_define_method(rb_cIO, "flush", rb_io_flush, 0); rb_define_method(rb_cIO, "tell", rb_io_tell, 0); - rb_define_method(rb_cIO, "seek", rb_io_seek, -1); + rb_define_method(rb_cIO, "seek", rb_io_seek_m, -1); rb_define_const(rb_cIO, "SEEK_SET", INT2FIX(SEEK_SET)); rb_define_const(rb_cIO, "SEEK_CUR", INT2FIX(SEEK_CUR)); rb_define_const(rb_cIO, "SEEK_END", INT2FIX(SEEK_END)); @@ -3548,7 +3563,7 @@ Init_IO() rb_define_singleton_method(argf, "getc", argf_getc, 0); rb_define_singleton_method(argf, "readchar", argf_readchar, 0); rb_define_singleton_method(argf, "tell", argf_tell, 0); - rb_define_singleton_method(argf, "seek", argf_seek, 2); + rb_define_singleton_method(argf, "seek", argf_seek_m, -1); rb_define_singleton_method(argf, "rewind", argf_rewind, 0); rb_define_singleton_method(argf, "pos", argf_tell, 0); rb_define_singleton_method(argf, "pos=", argf_set_pos, 1); diff --git a/lib/delegate.rb b/lib/delegate.rb index 480e1ef6b8..a72ea943ba 100644 --- a/lib/delegate.rb +++ b/lib/delegate.rb @@ -8,7 +8,7 @@ # Usage: # foo = Object.new # foo2 = SimpleDelegator.new(foo) -# foo.hash == foo2.hash # => true +# foo.hash == foo2.hash # => false # # Foo = DelegateClass(Array) # diff --git a/lib/mkmf.rb b/lib/mkmf.rb index 4692ea73c1..eb3cb74e16 100644 --- a/lib/mkmf.rb +++ b/lib/mkmf.rb @@ -375,7 +375,7 @@ def create_makefile(target, srcdir = File.dirname($0)) $DLDFLAGS = CONFIG["DLDFLAGS"] $libs = CONFIG["LIBRUBYARG"] + " " + $libs - $configure_args['--enable-shared'] or $LIBPATH |= ["$(topdir)"] + $configure_args['--enable-shared'] or $LIBPATH |= [$topdir] $LIBPATH |= [CONFIG["libdir"]] defflag = '' diff --git a/lib/profile.rb b/lib/profile.rb index b00caac42e..6f772ee6d9 100644 --- a/lib/profile.rb +++ b/lib/profile.rb @@ -1,6 +1,7 @@ module Profiler__ - Start = Float(Time.times[0]) + Times = if defined? Process.times then Process else Time end + Start = Float(Times::times[0]) top = "toplevel".intern Stack = [[0, 0, top]] MAP = {"#toplevel" => [1, 0, 0, "#toplevel"]} @@ -8,10 +9,10 @@ module Profiler__ p = proc{|event, file, line, id, binding, klass| case event when "call", "c-call" - now = Float(Time.times[0]) + now = Float(Times::times[0]) Stack.push [now, 0.0, id] when "return", "c-return" - now = Float(Time.times[0]) + now = Float(Times::times[0]) tick = Stack.pop name = klass.to_s if name.nil? then name = '' end @@ -35,7 +36,7 @@ module Profiler__ } END { set_trace_func nil - total = Float(Time.times[0]) - Start + total = Float(Times::times[0]) - Start if total == 0 then total = 0.01 end MAP["#toplevel"][1] = total # f = open("./rmon.out", "w") diff --git a/marshal.c b/marshal.c index a7b13ef1a0..35ceee9aa0 100644 --- a/marshal.c +++ b/marshal.c @@ -1056,7 +1056,7 @@ marshal_load(argc, argv) \tformat version %d.%d required; %d.%d given", MARSHAL_MAJOR, MARSHAL_MINOR, major, minor); } - if (minor != MARSHAL_MINOR) { + if (ruby_verbose && minor != MARSHAL_MINOR) { rb_warn("incompatible marshal file format (can be read)\n\ \tformat version %d.%d required; %d.%d given", MARSHAL_MAJOR, MARSHAL_MINOR, major, minor); diff --git a/math.c b/math.c index b2d61f609c..4af3cef96e 100644 --- a/math.c +++ b/math.c @@ -56,6 +56,62 @@ math_tan(obj, x) return rb_float_new(tan(RFLOAT(x)->value)); } +static VALUE +math_acos(obj, x) + VALUE obj, x; +{ + Need_Float(x); + /* + if (RFLOAT(x)->value < -1.0 || RFLOAT(x)->value > 1.0) + rb_raise(rb_eArgError, "Out of range (-1..1)"); + */ + return rb_float_new(acos(RFLOAT(x)->value)); +} + +static VALUE +math_asin(obj, x) + VALUE obj, x; +{ + Need_Float(x); + /* + if (RFLOAT(x)->value < -1.0 || RFLOAT(x)->value > 1.0) + rb_raise(rb_eArgError, "Out of range (-1..1)"); + */ + return rb_float_new(asin(RFLOAT(x)->value)); +} + +static VALUE +math_atan(obj, x) + VALUE obj, x; +{ + Need_Float(x); + return rb_float_new(atan(RFLOAT(x)->value)); +} + +static VALUE +math_cosh(obj, x) + VALUE obj, x; +{ + Need_Float(x); + return rb_float_new(cosh(RFLOAT(x)->value)); +} + +static VALUE +math_sinh(obj, x) + VALUE obj, x; +{ + Need_Float(x); + return rb_float_new(sinh(RFLOAT(x)->value)); +} + +static VALUE +math_tanh(obj, x) + VALUE obj, x; +{ + Need_Float(x); + return rb_float_new(tanh(RFLOAT(x)->value)); +} + static VALUE math_exp(obj, x) VALUE obj, x; @@ -118,6 +174,14 @@ math_ldexp(obj, x, n) return rb_float_new(d = ldexp(RFLOAT(x)->value, NUM2INT(n))); } +static VALUE +math_hypot(obj, x, y) + VALUE obj, x, y; +{ + Need_Float2(x, y); + return rb_float_new(hypot(RFLOAT(x)->value, RFLOAT(y)->value)); +} + void Init_Math() { @@ -140,6 +204,14 @@ Init_Math() rb_define_module_function(rb_mMath, "sin", math_sin, 1); rb_define_module_function(rb_mMath, "tan", math_tan, 1); + rb_define_module_function(rb_mMath, "acos", math_acos, 1); + rb_define_module_function(rb_mMath, "asin", math_asin, 1); + rb_define_module_function(rb_mMath, "atan", math_atan, 1); + + rb_define_module_function(rb_mMath, "cosh", math_cosh, 1); + rb_define_module_function(rb_mMath, "sinh", math_sinh, 1); + rb_define_module_function(rb_mMath, "tanh", math_tanh, 1); + rb_define_module_function(rb_mMath, "exp", math_exp, 1); rb_define_module_function(rb_mMath, "log", math_log, 1); rb_define_module_function(rb_mMath, "log10", math_log10, 1); @@ -147,4 +219,6 @@ Init_Math() rb_define_module_function(rb_mMath, "frexp", math_frexp, 1); rb_define_module_function(rb_mMath, "ldexp", math_ldexp, 2); + + rb_define_module_function(rb_mMath, "hypot", math_hypot, 2); } diff --git a/missing/hypot.c b/missing/hypot.c new file mode 100644 index 0000000000..aad5259e92 --- /dev/null +++ b/missing/hypot.c @@ -0,0 +1,17 @@ +/* public domain rewrite of hypot */ + +#include + +double hypot(x,y) + double x, y; +{ + if (x < 0) x = -x; + if (y < 0) y = -y; + if (x < y) { + double tmp = x; + x = y; y = tmp; + } + if (y == 0.0) return x; + y /= x; + return x * sqrt(1.0+y*y); +} diff --git a/numeric.c b/numeric.c index 8e372694e0..dc8a788bfc 100644 --- a/numeric.c +++ b/numeric.c @@ -947,7 +947,7 @@ rb_fix2str(x, base) else if (base == 8) fmt[2] = 'o'; else rb_fatal("fixnum cannot treat base %d", base); - snprintf(buf, 22, fmt, FIX2LONG(x)); + sprintf(buf, fmt, FIX2LONG(x)); return rb_str_new2(buf); } diff --git a/object.c b/object.c index 34a17ddc91..071dfb1bab 100644 --- a/object.c +++ b/object.c @@ -513,8 +513,8 @@ sym_inspect(sym) name = rb_id2name(SYM2ID(sym)); str = rb_str_new(0, strlen(name)+2); - sprintf(RSTRING(str)->ptr, ":%s", name); - RSTRING(str)->len = strlen(RSTRING(str)->ptr); + RSTRING(str)->ptr[0] = ':'; + strcpy(RSTRING(str)->ptr+1, name); return str; } diff --git a/parse.y b/parse.y index 93a4bf6566..ec4c9b3645 100644 --- a/parse.y +++ b/parse.y @@ -233,6 +233,7 @@ static void top_local_setup(); %token tOP_ASGN /* +=, -= etc. */ %token tASSOC /* => */ %token tLPAREN /* ( */ +%token tRPAREN /* ) */ %token tLBRACK /* [ */ %token tLBRACE /* { */ %token tSTAR /* * */ @@ -360,31 +361,21 @@ stmt : kALIAS fitem {lex_state = EXPR_FNAME;} fitem | stmt kWHILE_MOD expr { value_expr($3); - if ($1) { - if (nd_type($1) == NODE_BEGIN) { - $$ = NEW_WHILE(cond($3), $1->nd_body, 0); - } - else { - $$ = NEW_WHILE(cond($3), $1, 1); - } + if ($1 && nd_type($1) == NODE_BEGIN) { + $$ = NEW_WHILE(cond($3), $1->nd_body, 0); } else { - $$ = 0; + $$ = NEW_WHILE(cond($3), $1, 1); } } | stmt kUNTIL_MOD expr { value_expr($3); - if ($1) { - if (nd_type($1) == NODE_BEGIN) { - $$ = NEW_UNTIL(cond($3), $1->nd_body, 0); - } - else { - $$ = NEW_UNTIL(cond($3), $1, 1); - } + if ($1 && nd_type($1) == NODE_BEGIN) { + $$ = NEW_UNTIL(cond($3), $1->nd_body, 0); } else { - $$ = 0; + $$ = NEW_UNTIL(cond($3), $1, 1); } } | stmt kRESCUE_MOD stmt @@ -4470,20 +4461,20 @@ static void warn_unless_e_option(str) const char *str; { - if (e_option_supplied()) rb_warn(str); + if (!e_option_supplied()) rb_warn(str); } static void warning_unless_e_option(str) const char *str; { - if (e_option_supplied()) rb_warning(str); + if (!e_option_supplied()) rb_warning(str); } static NODE *cond0(); static NODE* -cond2(node, logop) +range_op(node, logop) NODE *node; int logop; { @@ -4512,39 +4503,31 @@ cond0(node, logop) assign_in_cond(node); switch (type) { case NODE_DSTR: + case NODE_STR: if (logop) break; - nd_set_type(node, NODE_DREGX); - warn_unless_e_option("string literal in condition"); - goto dregex; + warn("string literal in condition"); + break; case NODE_DREGX: case NODE_DREGX_ONCE: warning_unless_e_option("regex literal in condition"); - dregex: local_cnt('_'); local_cnt('~'); return NEW_MATCH2(node, NEW_GVAR(rb_intern("$_"))); case NODE_DOT2: case NODE_DOT3: - node->nd_beg = cond2(node->nd_beg, logop); - node->nd_end = cond2(node->nd_end, logop); + node->nd_beg = range_op(node->nd_beg, logop); + node->nd_end = range_op(node->nd_end, logop); if (type == NODE_DOT2) nd_set_type(node,NODE_FLIP2); else if (type == NODE_DOT3) nd_set_type(node, NODE_FLIP3); node->nd_cnt = local_append(0); warn_unless_e_option("range literal in condition"); break; - case NODE_STR: - if (logop) break; - node->nd_lit = rb_reg_new(RSTRING(node->nd_lit)->ptr,RSTRING(node->nd_lit)->len,0); - warn_unless_e_option("string literal in condition"); - goto regexp; - case NODE_LIT: if (TYPE(node->nd_lit) == T_REGEXP) { warning_unless_e_option("regex literal in condition"); - regexp: nd_set_type(node, NODE_MATCH); local_cnt('_'); local_cnt('~'); diff --git a/ruby.c b/ruby.c index 7d11ab129a..55bef5d534 100644 --- a/ruby.c +++ b/ruby.c @@ -430,7 +430,7 @@ proc_options(argc, argv) goto reswitch; case 'v': - if (verbose) { + if (argv0 == 0 || verbose) { s++; goto reswitch; } @@ -990,6 +990,7 @@ ruby_set_argv(argc, argv) if (origargv) dln_argv0 = origargv[0]; else dln_argv0 = argv[0]; #endif + rb_ary_clear(rb_argv); for (i=0; i < argc; i++) { rb_ary_push(rb_argv, rb_tainted_str_new2(argv[i])); } diff --git a/version.h b/version.h index 237e936d09..6ae7e2e7f4 100644 --- a/version.h +++ b/version.h @@ -1,4 +1,4 @@ #define RUBY_VERSION "1.7.0" -#define RUBY_RELEASE_DATE "2001-03-12" +#define RUBY_RELEASE_DATE "2001-03-13" #define RUBY_VERSION_CODE 170 -#define RUBY_RELEASE_CODE 20010312 +#define RUBY_RELEASE_CODE 20010313 -- cgit v1.2.3