зеркало из https://github.com/github/ruby.git
[ruby/stringio] Check if closed in loop
[Bug #17675] https://bugs.ruby-lang.org/issues/17675 https://github.com/ruby/stringio/commit/1ed61d0cbc
This commit is contained in:
Родитель
99f54c0895
Коммит
32a13591e0
|
@ -1,3 +1,4 @@
|
|||
/* -*- mode: c; indent-tabs-mode: t -*- */
|
||||
/**********************************************************************
|
||||
|
||||
stringio.c -
|
||||
|
@ -599,6 +600,14 @@ strio_closed_write(VALUE self)
|
|||
return Qtrue;
|
||||
}
|
||||
|
||||
static struct StringIO *
|
||||
strio_to_read(VALUE self)
|
||||
{
|
||||
struct StringIO *ptr = readable(self);
|
||||
if (ptr->pos < RSTRING_LEN(ptr->string)) return ptr;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
* call-seq:
|
||||
* strio.eof -> true or false
|
||||
|
@ -610,8 +619,7 @@ strio_closed_write(VALUE self)
|
|||
static VALUE
|
||||
strio_eof(VALUE self)
|
||||
{
|
||||
struct StringIO *ptr = readable(self);
|
||||
if (ptr->pos < RSTRING_LEN(ptr->string)) return Qfalse;
|
||||
if (strio_to_read(self)) return Qfalse;
|
||||
return Qtrue;
|
||||
}
|
||||
|
||||
|
@ -821,11 +829,11 @@ strio_get_sync(VALUE self)
|
|||
static VALUE
|
||||
strio_each_byte(VALUE self)
|
||||
{
|
||||
struct StringIO *ptr = readable(self);
|
||||
struct StringIO *ptr;
|
||||
|
||||
RETURN_ENUMERATOR(self, 0, 0);
|
||||
|
||||
while (ptr->pos < RSTRING_LEN(ptr->string)) {
|
||||
while ((ptr = strio_to_read(self)) != NULL) {
|
||||
char c = RSTRING_PTR(ptr->string)[ptr->pos++];
|
||||
rb_yield(CHR2FIX(c));
|
||||
}
|
||||
|
@ -1064,11 +1072,7 @@ strio_each_codepoint(VALUE self)
|
|||
|
||||
ptr = readable(self);
|
||||
enc = get_enc(ptr);
|
||||
for (;;) {
|
||||
if (ptr->pos >= RSTRING_LEN(ptr->string)) {
|
||||
return self;
|
||||
}
|
||||
|
||||
while ((ptr = strio_to_read(self)) != NULL) {
|
||||
c = rb_enc_codepoint_len(RSTRING_PTR(ptr->string)+ptr->pos,
|
||||
RSTRING_END(ptr->string), &n, enc);
|
||||
ptr->pos += n;
|
||||
|
|
|
@ -446,6 +446,15 @@ class TestStringIO < Test::Unit::TestCase
|
|||
f.close unless f.closed?
|
||||
end
|
||||
|
||||
def test_each_byte_closed
|
||||
f = StringIO.new("1234")
|
||||
assert_equal("1".ord, f.each_byte {|c| f.close; break c })
|
||||
f = StringIO.new("1234")
|
||||
assert_raise(IOError) do
|
||||
f.each_byte { f.close }
|
||||
end
|
||||
end
|
||||
|
||||
def test_getbyte
|
||||
f = StringIO.new("1234")
|
||||
assert_equal("1".ord, f.getbyte)
|
||||
|
@ -520,11 +529,29 @@ class TestStringIO < Test::Unit::TestCase
|
|||
assert_equal(%w(1 2 3 4), f.each_char.to_a)
|
||||
end
|
||||
|
||||
def test_each_char_closed
|
||||
f = StringIO.new("1234")
|
||||
assert_equal("1", f.each_char {|c| f.close; break c })
|
||||
f = StringIO.new("1234")
|
||||
assert_raise(IOError) do
|
||||
f.each_char { f.close }
|
||||
end
|
||||
end
|
||||
|
||||
def test_each_codepoint
|
||||
f = StringIO.new("1234")
|
||||
assert_equal([49, 50, 51, 52], f.each_codepoint.to_a)
|
||||
end
|
||||
|
||||
def test_each_codepoint_closed
|
||||
f = StringIO.new("1234")
|
||||
assert_equal("1".ord, f.each_codepoint {|c| f.close; break c })
|
||||
f = StringIO.new("1234")
|
||||
assert_raise(IOError) do
|
||||
f.each_codepoint { f.close }
|
||||
end
|
||||
end
|
||||
|
||||
def test_each_codepoint_enumerator
|
||||
io = StringIO.new('你好построить')
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче