diff options
| author | Tomoyuki Sahara <[email protected]> | 2016-09-30 17:10:55 +0900 |
|---|---|---|
| committer | Tomoyuki Sahara <[email protected]> | 2016-09-30 17:10:55 +0900 |
| commit | f6a82772e6f857856edb37fcb43a892b6022780f (patch) | |
| tree | 9f23096da2f02c8b3c0538a35ca4951da2de7412 | |
| parent | 2229a2aa0fcd76bd5498417aca934d6ec7a211ef (diff) | |
| download | mruby-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.h | 3 | ||||
| -rw-r--r-- | mrblib/io.rb | 1 | ||||
| -rw-r--r-- | src/io.c | 16 | ||||
| -rw-r--r-- | test/io.rb | 9 |
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 @@ -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') |
