From 13d9631e2188001f30cc68a62e1577352d9e3ef3 Mon Sep 17 00:00:00 2001 From: take_cheeze Date: Sun, 6 Jul 2014 22:23:29 +0900 Subject: Add new API `mrb_ary_resize`(mruby implementation of `rb_ary_resize`). --- include/mruby/array.h | 1 + src/array.c | 22 ++++++++++++++++++++++ 2 files changed, 23 insertions(+) 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) { -- cgit v1.2.3 From 5b0f900faacee1a7c5cdc01a979fce0157a2207e Mon Sep 17 00:00:00 2001 From: take_cheeze Date: Mon, 7 Jul 2014 21:58:38 +0900 Subject: Remove unnecessary out of memory check in `ary_expand_capa`. Since `mrb_realloc` raises when failed to allocate memory. --- src/array.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/array.c b/src/array.c index 600db7488..a016c225b 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; } -- cgit v1.2.3