From 6125313d69c158b423d1f4aff2e206cfd43a036a Mon Sep 17 00:00:00 2001 From: matz Date: Mon, 2 Jun 2003 04:49:46 +0000 Subject: * array.c (push_values_at): Array#values_at should work with ranges too. * range.c (rb_range_beg_len): length calculation was wrong. * eval.c (rb_call): should set T_ICLASS in the frame->last_class. [ruby-core:01110] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@3899 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 10 ++++++++++ array.c | 27 ++++++++++++++++++++++++++- error.c | 38 ++++++++++++++++++++++++++++---------- eval.c | 18 ++++++++++++++++-- io.c | 11 ----------- lib/cgi.rb | 30 ++++++++++++++++++------------ lib/ftools.rb | 14 +++++++------- lib/getoptlong.rb | 4 ++-- lib/jcode.rb | 4 ++-- lib/mkmf.rb | 2 +- lib/optparse.rb | 2 +- range.c | 9 ++------- 12 files changed, 113 insertions(+), 56 deletions(-) diff --git a/ChangeLog b/ChangeLog index db3359f85e..29fd4971c6 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +Mon Jun 2 02:20:52 2003 Yukihiro Matsumoto + + * array.c (push_values_at): Array#values_at should work with + ranges too. + + * range.c (rb_range_beg_len): length calculation was wrong. + + * eval.c (rb_call): should set T_ICLASS in the frame->last_class. + [ruby-core:01110] + Sun Jun 1 21:50:01 2003 WATANABE Hirofumi * configure.in: should not use def file, use ld with diff --git a/array.c b/array.c index 7359c05060..e0b5af8dce 100644 --- a/array.c +++ b/array.c @@ -1179,6 +1179,31 @@ rb_ary_collect_bang(ary) return ary; } +static void +push_values_at(result, ary, arg) + VALUE result, ary, arg; +{ + long beg, len, i; + + if (FIXNUM_P(arg)) { + rb_ary_push(result, rb_ary_entry(ary, FIX2LONG(arg))); + return; + } + /* check if idx is Range */ + switch (rb_range_beg_len(arg, &beg, &len, RARRAY(ary)->len, 0)) { + case Qfalse: + break; + case Qnil: + return; + default: + for (i=0; i n) { vsnprintf((char*)buf+n, len-n, fmt, args); } @@ -151,6 +158,15 @@ rb_warning(fmt, va_alist) va_end(args); } +static VALUE +rb_warn_m(self, mesg) + VALUE self, mesg; +{ + rb_io_write(rb_deferr, mesg); + rb_io_write(rb_deferr, rb_default_rs); + return mesg; +} + void #ifdef HAVE_STDARG_PROTOTYPES rb_bug(const char *fmt, ...) @@ -653,6 +669,8 @@ Init_Exception() rb_eNoMemError = rb_define_class("NoMemoryError", rb_eException); init_syserr(); + + rb_define_global_function("warn", rb_warn_m, 1); } void diff --git a/eval.c b/eval.c index 71213b0f64..07aad2a963 100644 --- a/eval.c +++ b/eval.c @@ -5041,6 +5041,7 @@ rb_call(klass, recv, mid, argc, argv, scope) int noex; ID id = mid; struct cache_entry *ent; + VALUE k = klass; if (!klass) { rb_raise(rb_eNotImpError, "method `%s' called on terminated object (0x%lx)", @@ -5051,17 +5052,30 @@ rb_call(klass, recv, mid, argc, argv, scope) if (ent->mid == mid && ent->klass == klass) { if (!ent->method) return rb_undefined(recv, mid, argc, argv, scope==2?CSTAT_VCALL:0); - klass = ent->origin; + k = ent->origin; id = ent->mid0; noex = ent->noex; body = ent->method; } - else if ((body = rb_get_method_body(&klass, &id, &noex)) == 0) { + else if ((body = rb_get_method_body(&k, &id, &noex)) == 0) { if (scope == 3) { return rb_undefined(recv, mid, argc, argv, CSTAT_SUPER); } return rb_undefined(recv, mid, argc, argv, scope==2?CSTAT_VCALL:0); } + if (BUILTIN_TYPE(k) == T_MODULE) { + while (!(BUILTIN_TYPE(klass) == T_ICLASS && RBASIC(klass)->klass == k)) { + klass = RCLASS(klass)->super; + if (!klass) { + rb_raise(rb_eTypeError, "%s is not included in %s", + rb_class2name(k), + rb_class2name(CLASS_OF(recv))); + } + } + } + else { + klass = k; + } if (mid != missing) { /* receiver specified form for private method */ diff --git a/io.c b/io.c index 3aceb78cbb..e5504b02da 100644 --- a/io.c +++ b/io.c @@ -2738,15 +2738,6 @@ rb_write_deferr(mesg) rb_write_deferr2(mesg, strlen(mesg)); } -static VALUE -rb_warn_m(self, mesg) - VALUE self, mesg; -{ - rb_io_write(rb_deferr, mesg); - rb_io_write(rb_deferr, rb_default_rs); - return mesg; -} - static void must_respond_to(mid, val, id) ID mid; @@ -4091,6 +4082,4 @@ Init_IO() #ifdef O_SYNC rb_file_const("SYNC", INT2FIX(O_SYNC)); #endif - - rb_define_global_function("warn", rb_warn_m, 1); } diff --git a/lib/cgi.rb b/lib/cgi.rb index dfeea5fc47..8f522ab7c1 100644 --- a/lib/cgi.rb +++ b/lib/cgi.rb @@ -494,7 +494,7 @@ status: if defined?(MOD_RUBY) table = Apache::request.headers_out buf.scan(/([^:]+): (.+)#{EOL}/n){ |name, value| - $stderr.printf("name:%s value:%s\n", name, value) if $DEBUG + warn sprintf("name:%s value:%s\n", name, value) if $DEBUG case name when 'Set-Cookie' table.add(name, value) @@ -942,24 +942,30 @@ convert string charset, and set language to "ja". private :initialize_query class Value < String - def [](key) - $stderr.puts < ", catname(from, to), "\n" if verbose + $deferr.print from, " -> ", catname(from, to), "\n" if verbose syscopy from, to end @@ -49,7 +49,7 @@ class << File def move from, to, verbose = false to = catname(from, to) - $stderr.print from, " -> ", to, "\n" if verbose + $deferr.print from, " -> ", to, "\n" if verbose if RUBY_PLATFORM =~ /djgpp|(cyg|ms|bcc)win|mingw/ and FileTest.file? to unlink to @@ -79,7 +79,7 @@ class << File # false: not identical def compare from, to, verbose = false - $stderr.print from, " <=> ", to, "\n" if verbose + $deferr.print from, " <=> ", to, "\n" if verbose return false if stat(from).size != stat(to).size @@ -116,11 +116,11 @@ class << File def safe_unlink(*files) verbose = if files[-1].is_a? String then false else files.pop end begin - $stderr.print files.join(" "), "\n" if verbose + $deferr.print files.join(" "), "\n" if verbose chmod 0777, *files unlink(*files) rescue -# STDERR.print "warning: Couldn't unlink #{files.join ' '}\n" +# $deferr.print "warning: Couldn't unlink #{files.join ' '}\n" end end @@ -134,7 +134,7 @@ class << File next if FileTest.directory? dir parent = dirname(dir) makedirs parent unless FileTest.directory? parent - $stderr.print "mkdir ", dir, "\n" if verbose + $deferr.print "mkdir ", dir, "\n" if verbose if basename(dir) != "" Dir.mkdir dir, mode end @@ -148,7 +148,7 @@ class << File vsave, $VERBOSE = $VERBOSE, false def chmod(mode, *files) verbose = if files[-1].is_a? String then false else files.pop end - $stderr.printf "chmod %04o %s\n", mode, files.join(" ") if verbose + $deferr.printf "chmod %04o %s\n", mode, files.join(" ") if verbose o_chmod mode, *files end $VERBOSE = vsave diff --git a/lib/getoptlong.rb b/lib/getoptlong.rb index 9c8ed09db9..7bb9baef2d 100644 --- a/lib/getoptlong.rb +++ b/lib/getoptlong.rb @@ -67,7 +67,7 @@ class GetoptLong @argument_flags = Hash.new # - # Whether error messages are output to stderr. + # Whether error messages are output to $deferr. # @quiet = FALSE @@ -253,7 +253,7 @@ class GetoptLong # Set an error (protected). # def set_error(type, message) - $stderr.print("#{$0}: #{message}\n") if !@quiet + $deferr.print("#{$0}: #{message}\n") if !@quiet @error = type @error_message = message diff --git a/lib/jcode.rb b/lib/jcode.rb index 8064518017..8cd770be26 100644 --- a/lib/jcode.rb +++ b/lib/jcode.rb @@ -1,12 +1,12 @@ # jcode.rb - ruby code to handle japanese (EUC/SJIS) string if $VERBOSE && $KCODE == "NONE" - STDERR.puts "Warning: $KCODE is NONE." + warn "Warning: $KCODE is NONE." end $vsave, $VERBOSE = $VERBOSE, false class String - printf STDERR, "feel free for some warnings:\n" if $VERBOSE + warn "feel free for some warnings:\n" if $VERBOSE def _regex_quote(str) str.gsub(/(\\[\[\]\-\\])|\\(.)|([\[\]\\])/) do diff --git a/lib/mkmf.rb b/lib/mkmf.rb index a1fed2278b..32e76d7dca 100644 --- a/lib/mkmf.rb +++ b/lib/mkmf.rb @@ -78,7 +78,7 @@ if not $extmk and File.exist? Config::CONFIG["archdir"] + "/ruby.h" elsif File.exist? $srcdir + "/ruby.h" $hdrdir = $srcdir else - STDERR.print "can't find header files for ruby.\n" + warn "can't find header files for ruby." exit 1 end $topdir = $hdrdir diff --git a/lib/optparse.rb b/lib/optparse.rb index de88b648ec..295f2bc94b 100644 --- a/lib/optparse.rb +++ b/lib/optparse.rb @@ -1597,7 +1597,7 @@ Extends command line arguments array to parse itself. begin yield @optparse rescue ParseError - STDERR.puts @optparse.program_name + ': ' + $! + warn @optparse.program_name + ': ' + $! nil end end diff --git a/range.c b/range.c index 5d398b5e6b..b7ef175440 100644 --- a/range.c +++ b/range.c @@ -369,27 +369,22 @@ rb_range_beg_len(range, begp, lenp, len, err) } if (err == 0 || err == 2) { if (beg > len) goto out_of_range; - if (end > len || (!EXCL(range) && end == len)) + if (end > len) end = len; } if (end < 0) { end += len; if (end < 0) { - if (beg == 0 && end == -1 && !EXCL(range)) { - len = 0; - goto length_set; - } goto out_of_range; } } + if (!EXCL(range)) end++; /* include end point */ len = end - beg; - if (!EXCL(range)) len++; /* include end point */ if (len < 0) goto out_of_range; length_set: *begp = beg; *lenp = len; - return Qtrue; out_of_range: -- cgit v1.2.3