diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2014-07-09 07:17:40 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2014-07-09 07:17:40 +0900 |
| commit | 506cda5a28b56750cb70b7b2a80317da524928c4 (patch) | |
| tree | 105e85443f351f5da36e815b0aa31cf682d4dec9 /src | |
| parent | 7baa56bad53a9891ee670e5256f333d02e16ae29 (diff) | |
| parent | ef432d75247f7aba1692c031fe9b5b1f1d55333d (diff) | |
| download | mruby-506cda5a28b56750cb70b7b2a80317da524928c4.tar.gz mruby-506cda5a28b56750cb70b7b2a80317da524928c4.zip | |
Merge branch 'master' of github.com:mruby/mruby
Diffstat (limited to 'src')
| -rw-r--r-- | src/array.c | 26 |
1 files changed, 22 insertions, 4 deletions
diff --git a/src/array.c b/src/array.c index 600db7488..875214105 100644 --- a/src/array.c +++ b/src/array.c @@ -200,10 +200,6 @@ ary_expand_capa(mrb_state *mrb, struct RArray *a, mrb_int len) if (capa > a->aux.capa) { mrb_value *expanded_ptr = (mrb_value *)mrb_realloc(mrb, a->ptr, sizeof(mrb_value)*capa); - if (!expanded_ptr) { - mrb_raise(mrb, E_RUNTIME_ERROR, "out of memory"); - } - a->aux.capa = capa; a->ptr = expanded_ptr; } @@ -231,6 +227,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) { |
