[ruby/stringio] StringIO#initialize default to the source string encoding

[Bug #16497]

https://github.com/ruby/stringio/commit/4958a5ccab
This commit is contained in:
Jean Boussier 2020-03-12 13:55:20 +01:00 коммит произвёл Nobuyoshi Nakada
Родитель d79890cbfa
Коммит e257c08f2e
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 4BC7D6DF58D8DF60
3 изменённых файлов: 21 добавлений и 4 удалений

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

@ -363,7 +363,12 @@ strio_init(int argc, VALUE *argv, struct StringIO *ptr, VALUE self)
rb_str_resize(string, 0); rb_str_resize(string, 0);
} }
ptr->string = string; ptr->string = string;
ptr->enc = convconfig.enc; if (argc == 1) {
ptr->enc = rb_enc_get(string);
}
else {
ptr->enc = convconfig.enc;
}
ptr->pos = 0; ptr->pos = 0;
ptr->lineno = 0; ptr->lineno = 0;
if (ptr->flags & FMODE_SETENC_BY_BOM) set_encoding_by_bom(ptr); if (ptr->flags & FMODE_SETENC_BY_BOM) set_encoding_by_bom(ptr);
@ -1759,9 +1764,6 @@ strio_set_encoding_by_bom(VALUE self)
{ {
struct StringIO *ptr = StringIO(self); struct StringIO *ptr = StringIO(self);
if (ptr->enc) {
rb_raise(rb_eArgError, "encoding conversion is set");
}
if (!set_encoding_by_bom(ptr)) return Qnil; if (!set_encoding_by_bom(ptr)) return Qnil;
return rb_enc_from_encoding(ptr->enc); return rb_enc_from_encoding(ptr->enc);
} }

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

@ -187,11 +187,14 @@ end
describe "StringIO#initialize sets the encoding to" do describe "StringIO#initialize sets the encoding to" do
before :each do before :each do
@external = Encoding.default_external @external = Encoding.default_external
@internal = Encoding.default_internal
Encoding.default_external = Encoding::ISO_8859_2 Encoding.default_external = Encoding::ISO_8859_2
Encoding.default_internal = Encoding::ISO_8859_2
end end
after :each do after :each do
Encoding.default_external = @external Encoding.default_external = @external
Encoding.default_internal = @internal
end end
it "Encoding.default_external when passed no arguments" do it "Encoding.default_external when passed no arguments" do

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

@ -797,6 +797,18 @@ class TestStringIO < Test::Unit::TestCase
end end
end end
def test_binary_encoding_read_and_default_internal
verbose, $VERBOSE = $VERBOSE, nil
default_internal = Encoding.default_internal
Encoding.default_internal = Encoding::UTF_8
$VERBOSE = verbose
assert_equal Encoding::BINARY, StringIO.new("Hello".b).read.encoding
ensure
$VERBOSE = nil
Encoding.default_internal = default_internal
$VERBOSE = verbose
end
def assert_string(content, encoding, str, mesg = nil) def assert_string(content, encoding, str, mesg = nil)
assert_equal([content, encoding], [str, str.encoding], mesg) assert_equal([content, encoding], [str, str.encoding], mesg)
end end