summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNobuyoshi Nakada <nobu@ruby-lang.org>2020-07-19 16:08:03 +0900
committerNobuyoshi Nakada <nobu@ruby-lang.org>2020-07-20 14:59:19 +0900
commitddb2acbba60302201f01175f019d8ecd99934add (patch)
tree396d515ee394573cfd4672bb79ddc9b7704b33af
parentc62aff16325c6b170f437f7ebe97c09387464ada (diff)
[ruby/stringio] No compatibility check in US-ASCII case
https://github.com/ruby/stringio/commit/59df1c8293
Notes
Notes: Merged: https://github.com/ruby/ruby/pull/3334
-rw-r--r--ext/stringio/stringio.c5
-rw-r--r--test/stringio/test_stringio.rb6
2 files changed, 9 insertions, 2 deletions
diff --git a/ext/stringio/stringio.c b/ext/stringio/stringio.c
index 9ab8537ac1..d55af518c7 100644
--- a/ext/stringio/stringio.c
+++ b/ext/stringio/stringio.c
@@ -1429,14 +1429,15 @@ strio_write(VALUE self, VALUE str)
long len, olen;
rb_encoding *enc, *enc2;
rb_encoding *const ascii8bit = rb_ascii8bit_encoding();
+ rb_encoding *usascii = 0;
if (!RB_TYPE_P(str, T_STRING))
str = rb_obj_as_string(str);
enc = get_enc(ptr);
enc2 = rb_enc_get(str);
- if (enc != enc2 && enc != ascii8bit) {
+ if (enc != enc2 && enc != ascii8bit && enc != (usascii = rb_usascii_encoding())) {
VALUE converted = rb_str_conv_enc(str, enc2, enc);
- if (converted == str && enc2 != ascii8bit) { /* conversion failed */
+ if (converted == str && enc2 != ascii8bit && enc2 != usascii) { /* conversion failed */
rb_enc_check(rb_enc_from_encoding(enc), str);
}
str = converted;
diff --git a/test/stringio/test_stringio.rb b/test/stringio/test_stringio.rb
index ab448f0aed..54f57165a4 100644
--- a/test/stringio/test_stringio.rb
+++ b/test/stringio/test_stringio.rb
@@ -195,9 +195,15 @@ class TestStringIO < Test::Unit::TestCase
s = StringIO.new.set_encoding(conversion_encoding)
s.write(convertible)
assert_equal(conversion_encoding, s.string.encoding)
+
s = StringIO.new.set_encoding(Encoding::UTF_8)
s.write("foo".force_encoding("ISO-8859-1"), convertible)
assert_equal(Encoding::UTF_8, s.string.encoding)
+
+ s = StringIO.new.set_encoding(Encoding::US_ASCII)
+ s.write("foo".force_encoding("US-ASCII"), convertible)
+ assert_equal(Encoding::UTF_8, s.string.encoding)
+
all_assertions do |a|
[
inconvertible,