Skip to content
Browse files

* 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: http://svn.ruby-lang.org/repos/ruby/trunk@3899 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
  • Loading branch information...
1 parent 453f1ea commit 3717865af5630794e31e1f92222072bd15426318 matz committed Jun 2, 2003
Showing with 113 additions and 56 deletions.
  1. +10 −0 ChangeLog
  2. +26 −1 array.c
  3. +28 −10 error.c
  4. +16 −2 eval.c
  5. +0 −11 io.c
  6. +18 −12 lib/cgi.rb
  7. +7 −7 lib/ftools.rb
  8. +2 −2 lib/getoptlong.rb
  9. +2 −2 lib/jcode.rb
  10. +1 −1 lib/mkmf.rb
  11. +1 −1 lib/optparse.rb
  12. +2 −7 range.c
View
10 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
View
27 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;
}
View
38 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
View
18 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 */
View
11 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);
}
View
30 lib/cgi.rb
@@ -494,7 +494,7 @@ def header(options = "text/html")
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 @@ def initialize_query()
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)
View
14 lib/ftools.rb
@@ -39,7 +39,7 @@ def syscopy from, to
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 @@ def copy from, to, verbose = false
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 @@ def move from, to, verbose = false
# 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 @@ def compare from, to, verbose = false
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 @@ def makedirs(*dirs)
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 @@ def makedirs(*dirs)
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
View
4 lib/getoptlong.rb
@@ -67,7 +67,7 @@ def initialize(*arguments)
@argument_flags = Hash.new
#
- # Whether error messages are output to stderr.
+ # Whether error messages are output to $deferr.
#
@quiet = FALSE
@@ -253,7 +253,7 @@ def terminated?
# 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
View
4 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
View
2 lib/mkmf.rb
@@ -78,7 +78,7 @@ def map_dir(dir, map = nil)
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
View
2 lib/optparse.rb
@@ -1597,7 +1597,7 @@ def options
begin
yield @optparse
rescue ParseError
- STDERR.puts @optparse.program_name + ': ' + $!
+ warn @optparse.program_name + ': ' + $!
nil
end
end
View
9 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:

0 comments on commit 3717865

Please sign in to comment.
Something went wrong with that request. Please try again.