diff --git a/io.c b/io.c index f78c09ba40..d0257ff42e 100644 --- a/io.c +++ b/io.c @@ -10312,6 +10312,12 @@ rb_io_s_pipe(int argc, VALUE *argv, VALUE klass) rb_io_synchronized(fptr2); extract_binmode(opt, &fmode); + + if ((fmode & FMODE_BINMODE) && v1 == Qnil) { + rb_io_ascii8bit_binmode(r); + rb_io_ascii8bit_binmode(w); + } + #if DEFAULT_TEXTMODE if ((fptr->mode & FMODE_TEXTMODE) && (fmode & FMODE_BINMODE)) { fptr->mode &= ~FMODE_TEXTMODE; diff --git a/test/ruby/test_io.rb b/test/ruby/test_io.rb index 0c81f4cb82..4a7866162a 100644 --- a/test/ruby/test_io.rb +++ b/test/ruby/test_io.rb @@ -113,6 +113,54 @@ def test_pipe ].each{|thr| thr.join} end + def test_binmode_pipe + EnvUtil.with_default_internal(Encoding::UTF_8) do + 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 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 + 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 + + reader3, writer3 = IO.pipe("UTF-8:UTF-8", binmode: true) + assert writer3.binmode? + assert_equal writer1.external_encoding, writer3.external_encoding + assert_equal writer1.internal_encoding, writer3.internal_encoding + assert 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 writer4.binmode? + assert_equal writer1.external_encoding, writer4.external_encoding + assert_equal writer1.internal_encoding, writer4.internal_encoding + assert 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 writer5.binmode? + assert_equal writer1.external_encoding, writer5.external_encoding + assert_equal writer1.internal_encoding, writer5.internal_encoding + assert reader5.binmode? + assert_equal reader1.external_encoding, reader5.external_encoding + assert_equal reader1.internal_encoding, reader5.internal_encoding + end + end + end + def test_pipe_block x = nil ret = IO.pipe {|r, w|