summaryrefslogtreecommitdiffhomepage
path: root/src/array.c
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2017-08-25 16:05:23 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2017-08-26 02:03:21 +0900
commit85a400e43d6b5c7ea193c65c70cdcd611869298b (patch)
tree6901166424f75fbcfd1708dd7c44e92bff200463 /src/array.c
parentcec53ff77e4885de5b1fb0e81f07166a04cb8d53 (diff)
downloadmruby-85a400e43d6b5c7ea193c65c70cdcd611869298b.tar.gz
mruby-85a400e43d6b5c7ea193c65c70cdcd611869298b.zip
Reimplement `Array#shift` to be faster.
Diffstat (limited to 'src/array.c')
-rw-r--r--src/array.c16
1 files changed, 12 insertions, 4 deletions
diff --git a/src/array.c b/src/array.c
index 3ccdd3262..8f33defe6 100644
--- a/src/array.c
+++ b/src/array.c
@@ -464,12 +464,20 @@ static mrb_value
mrb_ary_push_m(mrb_state *mrb, mrb_value self)
{
mrb_value *argv;
- mrb_int len;
+ mrb_int len, len2, alen;
+ struct RArray *a;
- mrb_get_args(mrb, "*!", &argv, &len);
- while (len--) {
- mrb_ary_push(mrb, self, *argv++);
+ mrb_get_args(mrb, "*!", &argv, &alen);
+ a = mrb_ary_ptr(self);
+ ary_modify(mrb, a);
+ len = ARY_LEN(a);
+ len2 = len + alen;
+ if (ARY_CAPA(a) < len2) {
+ ary_expand_capa(mrb, a, len2);
}
+ array_copy(ARY_PTR(a)+len, argv, alen);
+ ARY_SET_LEN(a, len2);
+ mrb_write_barrier(mrb, (struct RBasic*)a);
return self;
}