diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2014-07-08 23:01:22 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2014-07-08 23:01:22 +0900 |
| commit | 94c59d0597d3895224f57577d2134cee43dc2cbd (patch) | |
| tree | d0c485f8f00100b796badff2e01bcc1cbf171106 /src/array.c | |
| parent | 5c50bcd20a68394da3b90cf2ac3fba2b1ed43cff (diff) | |
| parent | 13d9631e2188001f30cc68a62e1577352d9e3ef3 (diff) | |
| download | mruby-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`).
Diffstat (limited to 'src/array.c')
| -rw-r--r-- | src/array.c | 22 |
1 files changed, 22 insertions, 0 deletions
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) { |
