From 6f1c08f7d8a43a5d220aca7a5c449a8d04d3017b Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Sat, 14 Sep 2019 15:58:11 +0900 Subject: Replace `String#byteslice` by custom `IO._bufread`. `byteslice` creates 2 string objects. `_bufread` creates one, and modifies the original buffer string, that is more efficient. --- mrbgems/mruby-io/src/io.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) (limited to 'mrbgems/mruby-io/src') diff --git a/mrbgems/mruby-io/src/io.c b/mrbgems/mruby-io/src/io.c index 784cdaf49..8228097cb 100644 --- a/mrbgems/mruby-io/src/io.c +++ b/mrbgems/mruby-io/src/io.c @@ -1294,6 +1294,27 @@ mrb_io_sync(mrb_state *mrb, mrb_value self) return mrb_bool_value(fptr->sync); } +static mrb_value +io_bufread(mrb_state *mrb, mrb_value self) +{ + mrb_value str, str2; + mrb_int len, newlen; + struct RString *s; + char *p; + + mrb_get_args(mrb, "Si", &str, &len); + s = RSTRING(str); + mrb_str_modify(mrb, s); + p = RSTR_PTR(s); + str2 = mrb_str_new(mrb, p, len); + newlen = RSTR_LEN(s)-len; + memmove(p, p+len, newlen); + p[newlen] = '\0'; + RSTR_SET_LEN(s, newlen); + + return str2; +} + void mrb_init_io(mrb_state *mrb) { @@ -1328,4 +1349,6 @@ mrb_init_io(mrb_state *mrb) mrb_define_method(mrb, io, "closed?", mrb_io_closed, MRB_ARGS_NONE()); /* 15.2.20.5.2 */ mrb_define_method(mrb, io, "pid", mrb_io_pid, MRB_ARGS_NONE()); /* 15.2.20.5.2 */ mrb_define_method(mrb, io, "fileno", mrb_io_fileno, MRB_ARGS_NONE()); + + mrb_define_class_method(mrb, io, "_bufread", io_bufread, MRB_ARGS_REQ(2)); } -- cgit v1.2.3