summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2014-07-08 23:01:22 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2014-07-08 23:01:22 +0900
commit94c59d0597d3895224f57577d2134cee43dc2cbd (patch)
treed0c485f8f00100b796badff2e01bcc1cbf171106
parent5c50bcd20a68394da3b90cf2ac3fba2b1ed43cff (diff)
parent13d9631e2188001f30cc68a62e1577352d9e3ef3 (diff)
downloadmruby-94c59d0597d3895224f57577d2134cee43dc2cbd.tar.gz
mruby-94c59d0597d3895224f57577d2134cee43dc2cbd.zip
Merge pull request #2449 from take-cheeze/mrb_ary_resize
Add new API `mrb_ary_resize`(mruby implementation of `rb_ary_resize`).
-rw-r--r--include/mruby/array.h1
-rw-r--r--src/array.c22
2 files changed, 23 insertions, 0 deletions
diff --git a/include/mruby/array.h b/include/mruby/array.h
index 5fbf71174..9db51aa5b 100644
--- a/include/mruby/array.h
+++ b/include/mruby/array.h
@@ -54,6 +54,7 @@ mrb_value mrb_ary_entry(mrb_value ary, mrb_int offset);
mrb_value mrb_ary_shift(mrb_state *mrb, mrb_value self);
mrb_value mrb_ary_clear(mrb_state *mrb, mrb_value self);
mrb_value mrb_ary_join(mrb_state *mrb, mrb_value ary, mrb_value sep);
+mrb_value mrb_ary_resize(mrb_state *mrb, mrb_value ary, mrb_int len);
static inline mrb_int
mrb_ary_len(mrb_state *mrb, mrb_value ary)
diff --git a/src/array.c b/src/array.c
index 600db7488..4c0a159c6 100644
--- a/src/array.c
+++ b/src/array.c
@@ -231,6 +231,28 @@ ary_shrink_capa(mrb_state *mrb, struct RArray *a)
}
}
+mrb_value
+mrb_ary_resize(mrb_state *mrb, mrb_value ary, mrb_int new_len)
+{
+ mrb_int old_len;
+ struct RArray *a = mrb_ary_ptr(ary);
+
+ ary_modify(mrb, a);
+ old_len = RARRAY_LEN(ary);
+ if (old_len != new_len) {
+ a->len = new_len;
+ if (new_len < old_len) {
+ ary_shrink_capa(mrb, a);
+ }
+ else {
+ ary_expand_capa(mrb, a, new_len);
+ ary_fill_with_nil(a->ptr + old_len, new_len - old_len);
+ }
+ }
+
+ return ary;
+}
+
static mrb_value
mrb_ary_s_create(mrb_state *mrb, mrb_value self)
{