diff options
author | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2009-01-21 15:33:06 +0000 |
---|---|---|
committer | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2009-01-21 15:33:06 +0000 |
commit | 76d9148d77c417abc3c0c4a9a93274c4170574f9 (patch) | |
tree | 1e53720c2983f8660e7fb2545068db5ab913e16e /array.c | |
parent | 82cfc630837475f186331a76eb2425401497fe7b (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_splice): ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8@21721 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'array.c')
-rw-r--r-- | array.c | 38 |
1 files changed, 25 insertions, 13 deletions
@@ -43,6 +43,29 @@ memfill(mem, size, val) } } +static void +ary_resize_capa(VALUE ary, long capacity) +{ + REALLOC_N(RARRAY(ary)->ptr, VALUE, capacity); + RARRAY(ary)->aux.capa = capacity; +} + +static void +ary_double_capa(VALUE ary, long min) +{ + long new_capa = RARRAY(ary)->aux.capa / 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; + REALLOC_N(RARRAY(ary)->ptr, VALUE, new_capa); + RARRAY(ary)->aux.capa = new_capa; +} + #define ARY_TMPLOCK FL_USER1 static inline void @@ -386,17 +409,7 @@ rb_ary_store(ary, idx, val) rb_ary_modify(ary); if (idx >= RARRAY(ary)->aux.capa) { - long new_capa = RARRAY(ary)->aux.capa / 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; - REALLOC_N(RARRAY(ary)->ptr, VALUE, new_capa); - RARRAY(ary)->aux.capa = new_capa; + ary_double_capa(ary, idx); } if (idx > RARRAY(ary)->len) { rb_mem_clear(RARRAY(ary)->ptr + RARRAY(ary)->len, @@ -1099,8 +1112,7 @@ rb_ary_splice(ary, beg, len, rpl) } len = beg + rlen; if (len >= RARRAY(ary)->aux.capa) { - REALLOC_N(RARRAY(ary)->ptr, VALUE, len); - RARRAY(ary)->aux.capa = len; + ary_double_capa(ary, len); } rb_mem_clear(RARRAY(ary)->ptr + RARRAY(ary)->len, beg - RARRAY(ary)->len); if (rlen > 0) { |