aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJeremy Evans <code@jeremyevans.net>2019-07-25 13:47:08 -0700
committerJeremy Evans <code@jeremyevans.net>2019-07-30 12:12:59 -0700
commitebc99e026d0ae770b297a93d1f1c1ceeffd13bfc (patch)
tree3056613c4ee5ac179256c200a9fcda888d6eaf4a
parentd8562ab2a40658db0e6a44ce07cfbe616b9b4078 (diff)
downloadruby-ebc99e026d0ae770b297a93d1f1c1ceeffd13bfc.tar.gz
Do not change IO.pipe encodings if encodings explicitly given
This commit makes it so that if the binmode option is given with any encoding arguments, the reader and writer IO objects are not set to binary encoding. Fixes [Bug #12989]
-rw-r--r--io.c2
-rw-r--r--test/ruby/test_io.rb72
2 files changed, 45 insertions, 29 deletions
diff --git a/io.c b/io.c
index 00d3716839..d0257ff42e 100644
--- a/io.c
+++ b/io.c
@@ -10313,7 +10313,7 @@ rb_io_s_pipe(int argc, VALUE *argv, VALUE klass)
extract_binmode(opt, &fmode);
- if (fmode & FMODE_BINMODE) {
+ if ((fmode & FMODE_BINMODE) && v1 == Qnil) {
rb_io_ascii8bit_binmode(r);
rb_io_ascii8bit_binmode(w);
}
diff --git a/test/ruby/test_io.rb b/test/ruby/test_io.rb
index e633e1c600..8c57ad35c1 100644
--- a/test/ruby/test_io.rb
+++ b/test/ruby/test_io.rb
@@ -113,35 +113,51 @@ class TestIO < Test::Unit::TestCase
].each{|thr| thr.join}
end
- def test_binmode_writer
+ def test_binmode_pipe
EnvUtil.with_default_internal(Encoding::UTF_8) do
- reader, writer = IO.pipe
- reader.binmode
- writer.binmode
-
- reader2, writer2 = IO.pipe(binmode: true)
-
- assert writer.binmode?
- assert writer2.binmode?
- assert_equal writer.binmode?, writer2.binmode?
- assert_equal writer.external_encoding, writer2.external_encoding
- assert_equal writer.internal_encoding, writer2.internal_encoding
- end
- end
-
- def test_binmode_reader
- EnvUtil.with_default_internal(Encoding::UTF_8) do
- reader, writer = IO.pipe
- reader.binmode
- writer.binmode
-
- reader2, writer2 = IO.pipe(binmode: true)
-
- assert reader.binmode?
- assert reader2.binmode?
- assert_equal reader.binmode?, reader2.binmode?
- assert_equal reader.external_encoding, reader2.external_encoding
- assert_equal reader.internal_encoding, reader2.internal_encoding
+ EnvUtil.with_default_external(Encoding::UTF_8) do
+ reader, writer = IO.pipe
+ reader.binmode
+ writer.binmode
+
+ reader1, writer1 = IO.pipe
+
+ reader2, writer2 = IO.pipe(binmode: true)
+ assert_predicate writer, :binmode?
+ assert_predicate writer2, :binmode?
+ assert_equal writer.binmode?, writer2.binmode?
+ assert_equal writer.external_encoding, writer2.external_encoding
+ assert_equal writer.internal_encoding, writer2.internal_encoding
+ assert_predicate reader, :binmode?
+ assert_predicate reader2, :binmode?
+ assert_equal reader.binmode?, reader2.binmode?
+ assert_equal reader.external_encoding, reader2.external_encoding
+ assert_equal reader.internal_encoding, reader2.internal_encoding
+
+ reader3, writer3 = IO.pipe("UTF-8:UTF-8", binmode: true)
+ assert_predicate writer3, :binmode?
+ assert_equal writer1.external_encoding, writer3.external_encoding
+ assert_equal writer1.internal_encoding, writer3.internal_encoding
+ assert_predicate reader3, :binmode?
+ assert_equal reader1.external_encoding, reader3.external_encoding
+ assert_equal reader1.internal_encoding, reader3.internal_encoding
+
+ reader4, writer4 = IO.pipe("UTF-8:UTF-8", binmode: true)
+ assert_predicate writer4, :binmode?
+ assert_equal writer1.external_encoding, writer4.external_encoding
+ assert_equal writer1.internal_encoding, writer4.internal_encoding
+ assert_predicate reader4, :binmode?
+ assert_equal reader1.external_encoding, reader4.external_encoding
+ assert_equal reader1.internal_encoding, reader4.internal_encoding
+
+ reader5, writer5 = IO.pipe("UTF-8", "UTF-8", binmode: true)
+ assert_predicate writer5, :binmode?
+ assert_equal writer1.external_encoding, writer5.external_encoding
+ assert_equal writer1.internal_encoding, writer5.internal_encoding
+ assert_predicate reader5, :binmode?
+ assert_equal reader1.external_encoding, reader5.external_encoding
+ assert_equal reader1.internal_encoding, reader5.internal_encoding
+ end
end
end