* 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
This commit is contained in:
parent
f5a7f85917
commit
6125313d69
10
ChangeLog
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
|
||||
|
27
array.c
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;
|
||||
}
|
||||
|
40
error.c
40
error.c
@ -26,6 +26,23 @@
|
||||
|
||||
int ruby_nerrs;
|
||||
|
||||
static int
|
||||
err_position(buf, len)
|
||||
char *buf;
|
||||
long len;
|
||||
{
|
||||
ruby_set_current_source();
|
||||
if (!ruby_sourcefile) {
|
||||
return 0;
|
||||
}
|
||||
else if (ruby_sourceline == 0) {
|
||||
return snprintf(buf, len, "%s: ", ruby_sourcefile);
|
||||
}
|
||||
else {
|
||||
return snprintf(buf, len, "%s:%d: ", ruby_sourcefile, ruby_sourceline);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
err_snprintf(buf, len, fmt, args)
|
||||
char *buf;
|
||||
@ -35,17 +52,7 @@ err_snprintf(buf, len, fmt, args)
|
||||
{
|
||||
long n;
|
||||
|
||||
ruby_set_current_source();
|
||||
if (!ruby_sourcefile) {
|
||||
vsnprintf(buf, len, fmt, args);
|
||||
return;
|
||||
}
|
||||
else if (ruby_sourceline == 0) {
|
||||
n = snprintf(buf, len, "%s: ", ruby_sourcefile);
|
||||
}
|
||||
else {
|
||||
n = snprintf(buf, len, "%s:%d: ", ruby_sourcefile, ruby_sourceline);
|
||||
}
|
||||
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
|
||||
|
18
eval.c
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 */
|
||||
|
11
io.c
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);
|
||||
}
|
||||
|
30
lib/cgi.rb
30
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)
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
9
range.c
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:
|
||||
|
Loading…
x
Reference in New Issue
Block a user