diff options
author | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2003-06-02 04:49:46 +0000 |
---|---|---|
committer | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2003-06-02 04:49:46 +0000 |
commit | 6125313d69c158b423d1f4aff2e206cfd43a036a (patch) | |
tree | a1a78a9425305557dcff6569806876989c9098c3 | |
parent | f5a7f85917abed4d64ad908a4837e0db0499c951 (diff) |
* 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
-rw-r--r-- | ChangeLog | 10 | ||||
-rw-r--r-- | array.c | 27 | ||||
-rw-r--r-- | error.c | 38 | ||||
-rw-r--r-- | eval.c | 18 | ||||
-rw-r--r-- | io.c | 11 | ||||
-rw-r--r-- | lib/cgi.rb | 30 | ||||
-rw-r--r-- | lib/ftools.rb | 14 | ||||
-rw-r--r-- | lib/getoptlong.rb | 4 | ||||
-rw-r--r-- | lib/jcode.rb | 4 | ||||
-rw-r--r-- | lib/mkmf.rb | 2 | ||||
-rw-r--r-- | lib/optparse.rb | 2 | ||||
-rw-r--r-- | range.c | 9 |
12 files changed, 113 insertions, 56 deletions
@@ -1,3 +1,13 @@ +Mon Jun 2 02:20:52 2003 Yukihiro Matsumoto <matz@ruby-lang.org> + + * 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 <eban@ruby-lang.org> * configure.in: should not use def file, use ld with @@ -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<len; i++) { + rb_ary_push(result, rb_ary_entry(ary, i+beg)); + } + return; + } + rb_ary_push(result, rb_ary_entry(ary, NUM2LONG(arg))); +} + static VALUE rb_ary_values_at(argc, argv, ary) int argc; @@ -1189,7 +1214,7 @@ rb_ary_values_at(argc, argv, ary) long i; for (i=0; i<argc; i++) { - rb_ary_push(result, rb_ary_entry(ary, NUM2LONG(argv[i]))); + push_values_at(result, ary, argv[i]); } return result; } @@ -26,26 +26,33 @@ int ruby_nerrs; -static void -err_snprintf(buf, len, fmt, args) +static int +err_position(buf, len) char *buf; long len; - const char *fmt; - va_list args; { - long n; - ruby_set_current_source(); if (!ruby_sourcefile) { - vsnprintf(buf, len, fmt, args); - return; + return 0; } else if (ruby_sourceline == 0) { - n = snprintf(buf, len, "%s: ", ruby_sourcefile); + return snprintf(buf, len, "%s: ", ruby_sourcefile); } else { - n = snprintf(buf, len, "%s:%d: ", ruby_sourcefile, ruby_sourceline); + return snprintf(buf, len, "%s:%d: ", ruby_sourcefile, ruby_sourceline); } +} + +static void +err_snprintf(buf, len, fmt, args) + char *buf; + long len; + const char *fmt; + va_list args; +{ + long n; + + n = err_position(buf, len); if (len > 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 @@ -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 */ @@ -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 <<END -CAUTION! cgi['key'] == cgi.params['key'][0] If want Array, use cgi.params['key'] -END - self + def initialize(str, params) + @params = params + super(str) + end + def [](idx) + p caller(1) + warn "#{caller(1)[0]}:CAUTION! cgi['key'] == cgi.params['key'][0]; if want Array, use cgi.params['key']" + self end def first - $stderr.puts <<END -CAUTION! cgi['key'] == cgi.params['key'][0] If want Array, use cgi.params['key'] -END - self + warn "#{caller(1)[0]}:CAUTION! cgi['key'] == cgi.params['key'][0]; if want Array, use cgi.params['key']" + self + end + alias last first + def to_a + @params end end def [](key) - value = @params[key][0] + params = @params[key] + value = params[0] value ||= "" - Value.new(value) + Value.new(value,params) end def keys(*args) diff --git a/lib/ftools.rb b/lib/ftools.rb index 6e1c886e56..6e058a824c 100644 --- a/lib/ftools.rb +++ b/lib/ftools.rb @@ -39,7 +39,7 @@ class << File end def copy from, to, verbose = false - $stderr.print from, " -> ", 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 @@ -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: |