summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2003-06-02 04:49:46 +0000
committermatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2003-06-02 04:49:46 +0000
commit6125313d69c158b423d1f4aff2e206cfd43a036a (patch)
treea1a78a9425305557dcff6569806876989c9098c3
parentf5a7f85917abed4d64ad908a4837e0db0499c951 (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--ChangeLog10
-rw-r--r--array.c27
-rw-r--r--error.c38
-rw-r--r--eval.c18
-rw-r--r--io.c11
-rw-r--r--lib/cgi.rb30
-rw-r--r--lib/ftools.rb14
-rw-r--r--lib/getoptlong.rb4
-rw-r--r--lib/jcode.rb4
-rw-r--r--lib/mkmf.rb2
-rw-r--r--lib/optparse.rb2
-rw-r--r--range.c9
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 <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
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<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;
}
diff --git a/error.c b/error.c
index e2d14304db..d9c673c807 100644
--- a/error.c
+++ b/error.c
@@ -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
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 <<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
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: