From 412b1f0fb3786f415e9e0a2de8be5c88ce7a7928 Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Fri, 6 Jan 2023 08:51:21 +0900 Subject: [PATCH] mruby-io/io.c: implement `IO#readlines` in C --- mrbgems/mruby-io/mrblib/io.rb | 8 -------- mrbgems/mruby-io/src/io.c | 13 +++++++++++++ 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/mrbgems/mruby-io/mrblib/io.rb b/mrbgems/mruby-io/mrblib/io.rb index 8a500f80c..0f18b0470 100644 --- a/mrbgems/mruby-io/mrblib/io.rb +++ b/mrbgems/mruby-io/mrblib/io.rb @@ -139,14 +139,6 @@ class IO self end - def readlines - ary = [] - while (line = gets) - ary << line - end - ary - end - def puts(*args) i = 0 len = args.size diff --git a/mrbgems/mruby-io/src/io.c b/mrbgems/mruby-io/src/io.c index 2998cf102..af3dd3eee 100644 --- a/mrbgems/mruby-io/src/io.c +++ b/mrbgems/mruby-io/src/io.c @@ -1796,6 +1796,18 @@ io_readline(mrb_state *mrb, mrb_value io) return result; } +static mrb_value +io_readlines(mrb_state *mrb, mrb_value io) +{ + mrb_value ary = mrb_ary_new(mrb); + for (;;) { + mrb_value line = io_gets(mrb, io); + + if (mrb_nil_p(line)) return ary; + mrb_ary_push(mrb, ary, line); + } +} + static mrb_value io_getc(mrb_state *mrb, mrb_value io) { @@ -1888,6 +1900,7 @@ mrb_init_io(mrb_state *mrb) mrb_define_method(mrb, io, "read", io_read, MRB_ARGS_OPT(2)); /* 15.2.20.5.14 */ mrb_define_method(mrb, io, "readchar", io_readchar, MRB_ARGS_NONE()); /* 15.2.20.5.15 */ mrb_define_method(mrb, io, "readline", io_readline, MRB_ARGS_OPT(2)); /* 15.2.20.5.16 */ + mrb_define_method(mrb, io, "readlines", io_readlines, MRB_ARGS_OPT(2)); /* 15.2.20.5.17 */ mrb_define_method(mrb, io, "sync", io_sync, MRB_ARGS_NONE()); /* 15.2.20.5.18 */ mrb_define_method(mrb, io, "sync=", io_set_sync, MRB_ARGS_REQ(1)); /* 15.2.20.5.19 */ mrb_define_method(mrb, io, "sysread", io_sysread, MRB_ARGS_ARG(1,1));