diff options
author | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2009-01-21 15:27:35 +0000 |
---|---|---|
committer | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2009-01-21 15:27:35 +0000 |
commit | d47e8e81a0a481c01bb12ca825866c92ff3d1db5 (patch) | |
tree | 83ff1003ac6fd11c4ff4c5fea1715af2b98fe42e /array.c | |
parent | 938fcd6b701e0ac1bf985da4a9d6314d6a0f9f08 (diff) |
* array.c (ary_double_capa): a new function to expand array more
aggressively. [ruby-core:21460]
* array.c (rb_ary_store): use ary_double_capa().
* array.c (rb_ary_unshift_m): ditto.
* array.c (rb_ary_splice): ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@21719 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'array.c')
-rw-r--r-- | array.c | 32 |
1 files changed, 19 insertions, 13 deletions
@@ -173,6 +173,21 @@ ary_resize_capa(VALUE ary, long capacity) } static void +ary_double_capa(VALUE ary, long min) +{ + long new_capa = ARY_CAPA(ary) / 2; + + if (new_capa < ARY_DEFAULT_SIZE) { + new_capa = ARY_DEFAULT_SIZE; + } + if (new_capa >= ARY_MAX_SIZE - min) { + new_capa = (ARY_MAX_SIZE - min) / 2; + } + new_capa += min; + ary_resize_capa(ary, new_capa); +} + +static void rb_ary_decrement_share(VALUE shared) { if (shared) { @@ -580,16 +595,7 @@ rb_ary_store(VALUE ary, long idx, VALUE val) rb_ary_modify(ary); if (idx >= ARY_CAPA(ary)) { - long new_capa = ARY_CAPA(ary) / 2; - - if (new_capa < ARY_DEFAULT_SIZE) { - new_capa = ARY_DEFAULT_SIZE; - } - if (new_capa >= ARY_MAX_SIZE - idx) { - new_capa = (ARY_MAX_SIZE - idx) / 2; - } - new_capa += idx; - ary_resize_capa(ary, new_capa); + ary_double_capa(ary, idx); } if (idx > RARRAY_LEN(ary)) { rb_mem_clear(RARRAY_PTR(ary) + RARRAY_LEN(ary), @@ -839,7 +845,7 @@ rb_ary_unshift_m(int argc, VALUE *argv, VALUE ary) if (argc == 0) return ary; rb_ary_modify(ary); if (ARY_CAPA(ary) <= (len = RARRAY_LEN(ary)) + argc) { - ary_resize_capa(ary, len + argc + ARY_DEFAULT_SIZE); + ary_double_capa(ary, len + argc); } /* sliding items */ @@ -1203,7 +1209,7 @@ rb_ary_splice(VALUE ary, long beg, long len, VALUE rpl) } len = beg + rlen; if (len >= ARY_CAPA(ary)) { - ary_resize_capa(ary, len); + ary_double_capa(ary, len); } rb_mem_clear(RARRAY_PTR(ary) + RARRAY_LEN(ary), beg - RARRAY_LEN(ary)); if (rlen > 0) { @@ -1216,7 +1222,7 @@ rb_ary_splice(VALUE ary, long beg, long len, VALUE rpl) alen = RARRAY_LEN(ary) + rlen - len; if (alen >= ARY_CAPA(ary)) { - ary_resize_capa(ary, alen); + ary_double_capa(ary, alen); } if (len != rlen) { |