summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--io.c6
-rw-r--r--test/ruby/test_io.rb63
3 files changed, 70 insertions, 4 deletions
diff --git a/ChangeLog b/ChangeLog
index 4a5026bad1..89114f8687 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Wed Dec 31 15:45:18 2008 Tanaka Akira <akr@fsij.org>
+
+ * io.c (copy_stream_body): don't check to_io because
+ Zlib::GzipWriter#to_io returns the underlying IO.
+
Wed Dec 31 14:52:33 2008 Tanaka Akira <akr@fsij.org>
* ext/openssl/ossl_digest.c (GetDigestPtr): use StringValueCStr
diff --git a/io.c b/io.c
index 7aeeeb8f1d..88f1c51e52 100644
--- a/io.c
+++ b/io.c
@@ -7653,13 +7653,12 @@ copy_stream_body(VALUE arg)
if (stp->src == argf ||
!(TYPE(stp->src) == T_FILE ||
- rb_respond_to(stp->src, rb_intern("to_io")) ||
TYPE(stp->src) == T_STRING ||
rb_respond_to(stp->src, rb_intern("to_path")))) {
src_fd = -1;
}
else {
- src_io = rb_check_convert_type(stp->src, T_FILE, "IO", "to_io");
+ src_io = TYPE(stp->src) == T_FILE ? stp->src : Qnil;
if (NIL_P(src_io)) {
VALUE args[2];
int oflags = O_RDONLY;
@@ -7681,13 +7680,12 @@ copy_stream_body(VALUE arg)
if (stp->dst == argf ||
!(TYPE(stp->dst) == T_FILE ||
- rb_respond_to(stp->dst, rb_intern("to_io")) ||
TYPE(stp->dst) == T_STRING ||
rb_respond_to(stp->dst, rb_intern("to_path")))) {
dst_fd = -1;
}
else {
- dst_io = rb_check_convert_type(stp->dst, T_FILE, "IO", "to_io");
+ dst_io = TYPE(stp->dst) == T_FILE ? stp->dst : Qnil;
if (NIL_P(dst_io)) {
VALUE args[3];
int oflags = O_WRONLY|O_CREAT|O_TRUNC;
diff --git a/test/ruby/test_io.rb b/test/ruby/test_io.rb
index 40808da772..073ca20314 100644
--- a/test/ruby/test_io.rb
+++ b/test/ruby/test_io.rb
@@ -526,6 +526,69 @@ class TestIO < Test::Unit::TestCase
}
end
+ class Rot13IO
+ def initialize(io)
+ @io = io
+ end
+
+ def readpartial(*args)
+ ret = @io.readpartial(*args)
+ ret.tr!('a-zA-Z', 'n-za-mN-ZA-M')
+ ret
+ end
+
+ def write(str)
+ @io.write(str.tr('a-zA-Z', 'n-za-mN-ZA-M'))
+ end
+
+ def to_io
+ @io
+ end
+ end
+
+ def test_copy_stream_io_to_rot13
+ mkcdtmpdir {
+ File.open("bar", "w") {|f| f << "vex" }
+ File.open("bar") {|src|
+ File.open("baz", "w") {|dst0|
+ dst = Rot13IO.new(dst0)
+ ret = IO.copy_stream(src, dst, 3)
+ assert_equal(3, ret)
+ }
+ assert_equal("irk", File.read("baz"))
+ }
+ }
+ end
+
+ def test_copy_stream_rot13_to_io
+ mkcdtmpdir {
+ File.open("bar", "w") {|f| f << "flap" }
+ File.open("bar") {|src0|
+ src = Rot13IO.new(src0)
+ File.open("baz", "w") {|dst|
+ ret = IO.copy_stream(src, dst, 4)
+ assert_equal(4, ret)
+ }
+ }
+ assert_equal("sync", File.read("baz"))
+ }
+ end
+
+ def test_copy_stream_rot13_to_rot13
+ mkcdtmpdir {
+ File.open("bar", "w") {|f| f << "bin" }
+ File.open("bar") {|src0|
+ src = Rot13IO.new(src0)
+ File.open("baz", "w") {|dst0|
+ dst = Rot13IO.new(dst0)
+ ret = IO.copy_stream(src, dst, 3)
+ assert_equal(3, ret)
+ }
+ }
+ assert_equal("bin", File.read("baz"))
+ }
+ end
+
def test_copy_stream_strio_flush
with_pipe {|r, w|
w.sync = false