summaryrefslogtreecommitdiff
path: root/io.c
diff options
context:
space:
mode:
authormatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>1998-04-23 06:53:19 +0000
committermatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>1998-04-23 06:53:19 +0000
commitc384393dcb4b11f083f62071e2c098b7beeb4fd2 (patch)
treeba9d1eb2468dcc8cd82953070f6a3748b6eb58a2 /io.c
parent313f260ee254f0353a18dbc4733cdc436ee5fb18 (diff)
use to_io
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/v1_1r@186 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'io.c')
-rw-r--r--io.c43
1 files changed, 36 insertions, 7 deletions
diff --git a/io.c b/io.c
index bd35ae77f5..4350a9acab 100644
--- a/io.c
+++ b/io.c
@@ -267,6 +267,13 @@ io_fileno(io)
return INT2FIX(fd);
}
+static VALUE
+io_to_io(io)
+ VALUE io;
+{
+ return io;
+}
+
/* reading functions */
#ifndef S_ISREG
@@ -1161,6 +1168,17 @@ f_open(argc, argv)
return port;
}
+static VALUE
+io_get_io(io)
+ VALUE io;
+{
+ if (TYPE(io) != T_FILE) {
+ io = rb_funcall(io, rb_intern("to_io"), 0, 0);
+ Check_Type(io, T_FILE);
+ }
+ return io;
+}
+
#ifndef NT
extern char *strdup();
#endif
@@ -1190,7 +1208,7 @@ io_reopen(io, nfile)
int fd;
GetOpenFile(io, fptr);
- Check_Type(nfile, T_FILE);
+ nfile = io_get_io(nfile);
GetOpenFile(nfile, orig);
if (orig->f2) {
@@ -1827,8 +1845,9 @@ f_select(argc, argv, obj)
rp = &rset;
FD_ZERO(rp);
for (i=0; i<RARRAY(read)->len; i++) {
- Check_Type(RARRAY(read)->ptr[i], T_FILE);
- GetOpenFile(RARRAY(read)->ptr[i], fptr);
+ VALUE io = io_get_io(RARRAY(read)->ptr[i]);
+
+ GetOpenFile(io, fptr);
FD_SET(fileno(fptr->f), rp);
if (READ_DATA_PENDING(fptr->f)) { /* check for buffered data */
pending++;
@@ -1849,8 +1868,9 @@ f_select(argc, argv, obj)
wp = &wset;
FD_ZERO(wp);
for (i=0; i<RARRAY(write)->len; i++) {
- Check_Type(RARRAY(write)->ptr[i], T_FILE);
- GetOpenFile(RARRAY(write)->ptr[i], fptr);
+ VALUE io = io_get_io(RARRAY(write)->ptr[i]);
+
+ GetOpenFile(io, fptr);
FD_SET(fileno(fptr->f), wp);
if (max > fileno(fptr->f)) max = fileno(fptr->f);
if (fptr->f2) {
@@ -1867,8 +1887,9 @@ f_select(argc, argv, obj)
ep = &eset;
FD_ZERO(ep);
for (i=0; i<RARRAY(except)->len; i++) {
- Check_Type(RARRAY(except)->ptr[i], T_FILE);
- GetOpenFile(RARRAY(except)->ptr[i], fptr);
+ VALUE io = io_get_io(RARRAY(except)->ptr[i]);
+
+ GetOpenFile(io, fptr);
FD_SET(fileno(fptr->f), ep);
if (max < fileno(fptr->f)) max = fileno(fptr->f);
if (fptr->f2) {
@@ -2239,6 +2260,12 @@ arg_fileno()
}
static VALUE
+arg_to_io()
+{
+ return file;
+}
+
+static VALUE
arg_read(argc, argv)
int argc;
VALUE *argv;
@@ -2458,6 +2485,7 @@ Init_IO()
rb_define_method(cIO, "fileno", io_fileno, 0);
rb_define_alias(cIO, "to_i", "fileno");
+ rb_define_method(cIO, "to_io", io_to_io, 0);
rb_define_method(cIO, "sync", io_sync, 0);
rb_define_method(cIO, "sync=", io_set_sync, 1);
@@ -2507,6 +2535,7 @@ Init_IO()
rb_define_singleton_method(argf, "fileno", arg_fileno, 0);
rb_define_singleton_method(argf, "to_i", arg_fileno, 0);
+ rb_define_singleton_method(argf, "to_io", arg_to_io, 0);
rb_define_singleton_method(argf, "each", arg_each_line, -1);
rb_define_singleton_method(argf, "each_line", arg_each_line, -1);
rb_define_singleton_method(argf, "each_byte", arg_each_byte, 0);