Nobuyoshi Nakada 2021-03-07 22:39:38 +09:00
Родитель 99f54c0895
Коммит 32a13591e0
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 7CD2805BFA3770C6
2 изменённых файлов: 40 добавлений и 9 удалений

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

@ -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('你好построить')