From d905746218be8ad1af754a04c1af7e372e93383d Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Thu, 29 Dec 2022 18:00:05 +0900 Subject: [PATCH] mruby-io/io.c: implement `IO#seek` in C --- mrbgems/mruby-io/mrblib/io.rb | 7 ------- mrbgems/mruby-io/src/io.c | 10 ++++++++++ 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/mrbgems/mruby-io/mrblib/io.rb b/mrbgems/mruby-io/mrblib/io.rb index 986e7136f..ebcbf0683 100644 --- a/mrbgems/mruby-io/mrblib/io.rb +++ b/mrbgems/mruby-io/mrblib/io.rb @@ -116,13 +116,6 @@ class IO seek(0, SEEK_SET) end - def seek(i, whence = SEEK_SET) - raise IOError if closed? - sysseek(i, whence) - @buf = '' - 0 - end - def ungetc(substr) raise TypeError.new "expect String, got #{substr.class}" unless substr.is_a?(String) if @buf.empty? diff --git a/mrbgems/mruby-io/src/io.c b/mrbgems/mruby-io/src/io.c index 6d24c98f7..8f43e44cd 100644 --- a/mrbgems/mruby-io/src/io.c +++ b/mrbgems/mruby-io/src/io.c @@ -998,6 +998,15 @@ io_sysseek(mrb_state *mrb, mrb_value io) return mrb_int_value(mrb, (mrb_int)pos); } +static mrb_value +io_seek(mrb_state *mrb, mrb_value io) +{ + mrb_value pos = io_sysseek(mrb, io); + mrb_value buf = mrb_iv_get(mrb, io, MRB_IVSYM(buf)); + mrb_str_resize(mrb, buf, 0); + return pos; +} + static mrb_value io_syswrite_common(mrb_state *mrb, fssize_t (*writefunc)(int, const void*, fsize_t, off_t), @@ -1621,6 +1630,7 @@ mrb_init_io(mrb_state *mrb) mrb_define_method(mrb, io, "sysread", io_sysread, MRB_ARGS_ARG(1,1)); mrb_define_method(mrb, io, "sysseek", io_sysseek, MRB_ARGS_ARG(1,1)); mrb_define_method(mrb, io, "syswrite", io_syswrite, MRB_ARGS_REQ(1)); + mrb_define_method(mrb, io, "seek", io_seek, MRB_ARGS_ARG(1,1)); mrb_define_method(mrb, io, "close", io_close, MRB_ARGS_NONE()); /* 15.2.20.5.1 */ mrb_define_method(mrb, io, "close_write", io_close_write, MRB_ARGS_NONE()); mrb_define_method(mrb, io, "close_on_exec=", io_set_close_on_exec, MRB_ARGS_REQ(1));