summaryrefslogtreecommitdiffhomepage
path: root/mrbgems/mruby-io/src/io.c
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2019-09-14 15:58:11 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2019-09-14 23:21:44 +0900
commit6f1c08f7d8a43a5d220aca7a5c449a8d04d3017b (patch)
tree909b7875490061854828f40e5495e8cc335c631d /mrbgems/mruby-io/src/io.c
parentdcc2d44d930ee5dea7e737ad6fa298d3f4bf9f59 (diff)
downloadmruby-6f1c08f7d8a43a5d220aca7a5c449a8d04d3017b.tar.gz
mruby-6f1c08f7d8a43a5d220aca7a5c449a8d04d3017b.zip
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.
Diffstat (limited to 'mrbgems/mruby-io/src/io.c')
-rw-r--r--mrbgems/mruby-io/src/io.c23
1 files changed, 23 insertions, 0 deletions
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));
}