summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2014-07-09 07:17:40 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2014-07-09 07:17:40 +0900
commit506cda5a28b56750cb70b7b2a80317da524928c4 (patch)
tree105e85443f351f5da36e815b0aa31cf682d4dec9 /src
parent7baa56bad53a9891ee670e5256f333d02e16ae29 (diff)
parentef432d75247f7aba1692c031fe9b5b1f1d55333d (diff)
downloadmruby-506cda5a28b56750cb70b7b2a80317da524928c4.tar.gz
mruby-506cda5a28b56750cb70b7b2a80317da524928c4.zip
Merge branch 'master' of github.com:mruby/mruby
Diffstat (limited to 'src')
-rw-r--r--src/array.c26
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)
{