From af59e30710ea72aa479e6d26ae5c6951d1954d11 Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Fri, 30 Dec 2022 09:34:45 +0900 Subject: [PATCH] mruby-io/io.c: implement `IO#pos` in C --- mrbgems/mruby-io/mrblib/io.rb | 6 +----- mrbgems/mruby-io/src/io.c | 12 ++++++++++++ 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/mrbgems/mruby-io/mrblib/io.rb b/mrbgems/mruby-io/mrblib/io.rb index ebcbf0683..f482f97e2 100644 --- a/mrbgems/mruby-io/mrblib/io.rb +++ b/mrbgems/mruby-io/mrblib/io.rb @@ -100,12 +100,8 @@ class IO return true end end - alias_method :eof, :eof? - def pos - raise IOError if closed? - sysseek(0, SEEK_CUR) - @buf.bytesize - end + alias_method :eof, :eof? alias_method :tell, :pos def pos=(i) diff --git a/mrbgems/mruby-io/src/io.c b/mrbgems/mruby-io/src/io.c index 6478cd643..46b82b2d8 100644 --- a/mrbgems/mruby-io/src/io.c +++ b/mrbgems/mruby-io/src/io.c @@ -1130,6 +1130,17 @@ io_closed(mrb_state *mrb, mrb_value io) return mrb_true_value(); } +static mrb_value +io_pos(mrb_state *mrb, mrb_value io) +{ + struct mrb_io *fptr = io_get_open_fptr(mrb, io); + off_t pos = lseek(fptr->fd, 0, SEEK_CUR); + if (pos == -1) mrb_sys_fail(mrb, 0); + + mrb_value buf = mrb_iv_get(mrb, io, MRB_IVSYM(buf)); + return mrb_int_value(mrb, pos - RSTRING_LEN(buf)); +} + static mrb_value io_pid(mrb_state *mrb, mrb_value io) { @@ -1636,6 +1647,7 @@ mrb_init_io(mrb_state *mrb) mrb_define_method(mrb, io, "close_on_exec=", io_set_close_on_exec, MRB_ARGS_REQ(1)); mrb_define_method(mrb, io, "close_on_exec?", io_close_on_exec_p, MRB_ARGS_NONE()); mrb_define_method(mrb, io, "closed?", io_closed, MRB_ARGS_NONE()); /* 15.2.20.5.2 */ + mrb_define_method(mrb, io, "pos", io_pos, MRB_ARGS_NONE()); mrb_define_method(mrb, io, "pid", io_pid, MRB_ARGS_NONE()); mrb_define_method(mrb, io, "fileno", io_fileno, MRB_ARGS_NONE()); mrb_define_method(mrb, io, "write", io_write, MRB_ARGS_ANY()); /* 15.2.20.5.20 */