From 7d92e5cf730596429fd33ce7a580112b28528662 Mon Sep 17 00:00:00 2001 From: nobu Date: Wed, 25 Nov 2015 12:23:42 +0000 Subject: io.c: try to_io first * io.c (copy_stream_body): try to_io conversion before read, readpartial, and write methods. [ruby-dev:49008] [Bug #11199] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@52750 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- io.c | 75 +++++++++++++++++++++++++++++++++++--------------------------------- 1 file changed, 39 insertions(+), 36 deletions(-) (limited to 'io.c') diff --git a/io.c b/io.c index 9d75c230f4..9306b81d18 100644 --- a/io.c +++ b/io.c @@ -10573,54 +10573,57 @@ copy_stream_body(VALUE arg) stp->total = 0; - if (src_io == argf) { - src_fd = -1; - } - else if (RB_TYPE_P(src_io, T_FILE)) { - goto io_src; - } - else if (!RB_TYPE_P(src_io, T_STRING) && - (rb_respond_to(src_io, id_read) || - rb_respond_to(src_io, id_readpartial))) { + if (src_io == argf || + !(RB_TYPE_P(src_io, T_FILE) || + RB_TYPE_P(src_io, T_STRING) || + rb_respond_to(src_io, rb_intern("to_path")))) { src_fd = -1; } else { - VALUE args[2]; - FilePathValue(src_io); - args[0] = src_io; - args[1] = INT2NUM(O_RDONLY|common_oflags); - src_io = rb_class_new_instance(2, args, rb_cFile); - stp->src = src_io; - stp->close_src = 1; - io_src: + VALUE tmp_io = rb_io_check_io(src_io); + if (!NIL_P(tmp_io)) { + src_io = tmp_io; + } + else if (!RB_TYPE_P(src_io, T_FILE)) { + VALUE args[2]; + FilePathValue(src_io); + args[0] = src_io; + args[1] = INT2NUM(O_RDONLY|common_oflags); + src_io = rb_class_new_instance(2, args, rb_cFile); + stp->src = src_io; + stp->close_src = 1; + } GetOpenFile(src_io, src_fptr); rb_io_check_byte_readable(src_fptr); src_fd = src_fptr->fd; } stp->src_fd = src_fd; - if (dst_io == argf) { - dst_fd = -1; - } - else if (RB_TYPE_P(dst_io, T_FILE)) { - dst_io = GetWriteIO(dst_io); - stp->dst = dst_io; - goto io_dst; - } - else if (!RB_TYPE_P(dst_io, T_STRING) && - rb_respond_to(dst_io, id_write)) { + if (dst_io == argf || + !(RB_TYPE_P(dst_io, T_FILE) || + RB_TYPE_P(dst_io, T_STRING) || + rb_respond_to(dst_io, rb_intern("to_path")))) { dst_fd = -1; } else { - VALUE args[3]; - FilePathValue(dst_io); - args[0] = dst_io; - args[1] = INT2NUM(O_WRONLY|O_CREAT|O_TRUNC|common_oflags); - args[2] = INT2FIX(0666); - dst_io = rb_class_new_instance(3, args, rb_cFile); - stp->dst = dst_io; - stp->close_dst = 1; - io_dst: + VALUE tmp_io = rb_io_check_io(dst_io); + if (!NIL_P(tmp_io)) { + dst_io = tmp_io; + } + else if (!RB_TYPE_P(dst_io, T_FILE)) { + VALUE args[3]; + FilePathValue(dst_io); + args[0] = dst_io; + args[1] = INT2NUM(O_WRONLY|O_CREAT|O_TRUNC|common_oflags); + args[2] = INT2FIX(0666); + dst_io = rb_class_new_instance(3, args, rb_cFile); + stp->dst = dst_io; + stp->close_dst = 1; + } + else { + dst_io = GetWriteIO(dst_io); + stp->dst = dst_io; + } GetOpenFile(dst_io, dst_fptr); rb_io_check_writable(dst_fptr); dst_fd = dst_fptr->fd; -- cgit v1.2.3