summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorTomoyuki Sahara <[email protected]>2016-09-30 17:10:55 +0900
committerTomoyuki Sahara <[email protected]>2016-09-30 17:10:55 +0900
commitf6a82772e6f857856edb37fcb43a892b6022780f (patch)
tree9f23096da2f02c8b3c0538a35ca4951da2de7412
parent2229a2aa0fcd76bd5498417aca934d6ec7a211ef (diff)
downloadmruby-f6a82772e6f857856edb37fcb43a892b6022780f.tar.gz
mruby-f6a82772e6f857856edb37fcb43a892b6022780f.zip
eof? should raise an IOError if it is not opened for reading.
-rw-r--r--include/mruby/ext/io.h3
-rw-r--r--mrblib/io.rb1
-rw-r--r--src/io.c16
-rw-r--r--test/io.rb9
4 files changed, 23 insertions, 6 deletions
diff --git a/include/mruby/ext/io.h b/include/mruby/ext/io.h
index 3107f1053..8f412fc02 100644
--- a/include/mruby/ext/io.h
+++ b/include/mruby/ext/io.h
@@ -13,7 +13,8 @@ struct mrb_io {
int fd; /* file descriptor, or -1 */
int fd2; /* file descriptor to write if it's different from fd, or -1 */
int pid; /* child's pid (for pipes) */
- unsigned int writable:1,
+ unsigned int readable:1,
+ writable:1,
sync:1;
};
diff --git a/mrblib/io.rb b/mrblib/io.rb
index 8408aea87..0b10c82aa 100644
--- a/mrblib/io.rb
+++ b/mrblib/io.rb
@@ -133,6 +133,7 @@ class IO
end
def eof?
+ _check_readable
begin
buf = _read_buf
return buf.size == 0
diff --git a/src/io.c b/src/io.c
index c9b1a8eb6..f942d564c 100644
--- a/src/io.c
+++ b/src/io.c
@@ -254,6 +254,7 @@ mrb_io_alloc(mrb_state *mrb)
fptr->fd = -1;
fptr->fd2 = -1;
fptr->pid = 0;
+ fptr->readable = 0;
fptr->writable = 0;
fptr->sync = 0;
return fptr;
@@ -394,6 +395,7 @@ mrb_io_s_popen(mrb_state *mrb, mrb_value klass)
fptr->fd = fd;
fptr->fd2 = write_fd;
fptr->pid = pid;
+ fptr->readable = ((flags & FMODE_READABLE) != 0);
fptr->writable = ((flags & FMODE_WRITABLE) != 0);
fptr->sync = 0;
@@ -454,6 +456,7 @@ mrb_io_initialize(mrb_state *mrb, mrb_value io)
DATA_PTR(io) = fptr;
fptr->fd = fd;
+ fptr->readable = ((flags & FMODE_READABLE) != 0);
fptr->writable = ((flags & FMODE_WRITABLE) != 0);
fptr->sync = 0;
return io;
@@ -500,6 +503,16 @@ fptr_finalize(mrb_state *mrb, struct mrb_io *fptr, int quiet)
}
mrb_value
+mrb_io_check_readable(mrb_state *mrb, mrb_value self)
+{
+ struct mrb_io *fptr = io_get_open_fptr(mrb, self);
+ if (! fptr->readable) {
+ mrb_raise(mrb, E_IO_ERROR, "not opened for reading");
+ }
+ return mrb_nil_value();
+}
+
+mrb_value
mrb_io_isatty(mrb_state *mrb, mrb_value self)
{
struct mrb_io *fptr;
@@ -772,6 +785,7 @@ mrb_io_s_pipe(mrb_state *mrb, mrb_value klass)
mrb_iv_set(mrb, r, mrb_intern_cstr(mrb, "@pos"), mrb_fixnum_value(0));
fptr_r = mrb_io_alloc(mrb);
fptr_r->fd = pipes[0];
+ fptr_r->readable = 1;
fptr_r->writable = 0;
fptr_r->sync = 0;
DATA_TYPE(r) = &mrb_io_type;
@@ -782,6 +796,7 @@ mrb_io_s_pipe(mrb_state *mrb, mrb_value klass)
mrb_iv_set(mrb, w, mrb_intern_cstr(mrb, "@pos"), mrb_fixnum_value(0));
fptr_w = mrb_io_alloc(mrb);
fptr_w->fd = pipes[1];
+ fptr_w->readable = 0;
fptr_w->writable = 1;
fptr_w->sync = 1;
DATA_TYPE(w) = &mrb_io_type;
@@ -1062,6 +1077,7 @@ mrb_init_io(mrb_state *mrb)
#endif
mrb_define_method(mrb, io, "initialize", mrb_io_initialize, MRB_ARGS_ANY()); /* 15.2.20.5.21 (x)*/
+ mrb_define_method(mrb, io, "_check_readable", mrb_io_check_readable, MRB_ARGS_NONE());
mrb_define_method(mrb, io, "isatty", mrb_io_isatty, MRB_ARGS_NONE());
mrb_define_method(mrb, io, "sync", mrb_io_sync, MRB_ARGS_NONE());
mrb_define_method(mrb, io, "sync=", mrb_io_set_sync, MRB_ARGS_REQ(1));
diff --git a/test/io.rb b/test/io.rb
index c3f78da7e..e1ea4640e 100644
--- a/test/io.rb
+++ b/test/io.rb
@@ -70,12 +70,11 @@ end
#assert('IO#each_line', '15.2.20.5.5') do
assert('IO#eof?', '15.2.20.5.6') do
- if false # XXX: not implemented yet
- io = IO.new(IO.sysopen($mrbtest_io_wfname, 'w'), 'w')
- assert_raise(IOError) do
- io.eof?
- end
+ io = IO.new(IO.sysopen($mrbtest_io_wfname, 'w'), 'w')
+ assert_raise(IOError) do
+ io.eof?
end
+ io.close
# empty file
io = IO.open(IO.sysopen($mrbtest_io_wfname, 'w'), 'w')