* io.c (rb_io_each_byte): caused infinite loop. [ruby-dev:31652]

* io.c (rb_io_getc): should return nil at EOF, not EOFError.

* lib/delegate.rb (SimpleDelegator::__setobj__): use raise
  argument to specify backtrace.

* test/ruby/test_fnmatch.rb (TestFnmatch::bracket_test):
  String#include? no longer works for Fixnum.  use #chr.
  [ruby-dev:31652]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@13280 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
matz 2007-08-26 17:22:26 +00:00
Родитель 98d6d636e3
Коммит 1a0b7d0fb6
4 изменённых файлов: 22 добавлений и 8 удалений

Просмотреть файл

@ -1,3 +1,16 @@
Mon Aug 27 00:41:13 2007 Yukihiro Matsumoto <matz@ruby-lang.org>
* io.c (rb_io_each_byte): caused infinite loop. [ruby-dev:31652]
* io.c (rb_io_getc): should return nil at EOF, not EOFError.
* lib/delegate.rb (SimpleDelegator::__setobj__): use raise
argument to specify backtrace.
* test/ruby/test_fnmatch.rb (TestFnmatch::bracket_test):
String#include? no longer works for Fixnum. use #chr.
[ruby-dev:31652]
Sun Aug 26 12:27:14 2007 Koichi Sasada <ko1@atdot.net> Sun Aug 26 12:27:14 2007 Koichi Sasada <ko1@atdot.net>
* cont.c: fix to remove Fiber.new until fiber.so is not loaded. * cont.c: fix to remove Fiber.new until fiber.so is not loaded.

8
io.c
Просмотреть файл

@ -2022,12 +2022,14 @@ rb_io_each_byte(VALUE io)
rb_yield(INT2FIX(*p & 0xff)); rb_yield(INT2FIX(*p & 0xff));
p++; p++;
} }
fptr->rbuf_off += fptr->rbuf_len;
fptr->rbuf_len = 0;
rb_io_check_readable(fptr); rb_io_check_readable(fptr);
READ_CHECK(fptr); READ_CHECK(fptr);
if (io_fillbuf(fptr) < 0) { if (io_fillbuf(fptr) < 0) {
break; break;
} }
} }
return io; return io;
} }
@ -2090,7 +2092,7 @@ rb_io_getc(VALUE io)
READ_CHECK(fptr); READ_CHECK(fptr);
if (io_fillbuf(fptr) < 0) { if (io_fillbuf(fptr) < 0) {
rb_eof_error(); return Qnil;
} }
n = rb_enc_mbclen(fptr->rbuf+fptr->rbuf_off, enc); n = rb_enc_mbclen(fptr->rbuf+fptr->rbuf_off, enc);
if (n < fptr->rbuf_len) { if (n < fptr->rbuf_len) {
@ -2103,7 +2105,7 @@ rb_io_getc(VALUE io)
left = fptr->rbuf_len; left = fptr->rbuf_len;
MEMCPY(RSTRING_PTR(str), fptr->rbuf+fptr->rbuf_off, char, left); MEMCPY(RSTRING_PTR(str), fptr->rbuf+fptr->rbuf_off, char, left);
if (io_fillbuf(fptr) < 0) { if (io_fillbuf(fptr) < 0) {
rb_eof_error(); return Qnil;
} }
MEMCPY(RSTRING_PTR(str)+left, fptr->rbuf, char, n-left); MEMCPY(RSTRING_PTR(str)+left, fptr->rbuf, char, n-left);
fptr->rbuf_off += left; fptr->rbuf_off += left;

Просмотреть файл

@ -283,8 +283,7 @@ def DelegateClass(superclass)
begin begin
@delegate_dc_obj.__send(:#{method}, *args, &block) @delegate_dc_obj.__send(:#{method}, *args, &block)
rescue rescue
$@[0,2] = nil raise $!, $@[2..-1]
raise
end end
end end
EOS EOS

Просмотреть файл

@ -4,9 +4,9 @@ class TestFnmatch < Test::Unit::TestCase
def bracket_test(s, t) # `s' should start with neither '!' nor '^' def bracket_test(s, t) # `s' should start with neither '!' nor '^'
0x21.upto(0x7E) do |i| 0x21.upto(0x7E) do |i|
assert_equal(t.include?(i), File.fnmatch("[#{s}]", i.chr, File::FNM_DOTMATCH)) assert_equal(t.include?(i.chr), File.fnmatch("[#{s}]", i.chr, File::FNM_DOTMATCH))
assert_equal(t.include?(i), !File.fnmatch("[^#{s}]", i.chr, File::FNM_DOTMATCH)) assert_equal(t.include?(i.chr), !File.fnmatch("[^#{s}]", i.chr, File::FNM_DOTMATCH))
assert_equal(t.include?(i), !File.fnmatch("[!#{s}]", i.chr, File::FNM_DOTMATCH)) assert_equal(t.include?(i.chr), !File.fnmatch("[!#{s}]", i.chr, File::FNM_DOTMATCH))
end end
end end
def test_fnmatch def test_fnmatch