summaryrefslogtreecommitdiff
path: root/array.c
diff options
context:
space:
mode:
authormatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2009-01-21 15:33:06 +0000
committermatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2009-01-21 15:33:06 +0000
commit76d9148d77c417abc3c0c4a9a93274c4170574f9 (patch)
tree1e53720c2983f8660e7fb2545068db5ab913e16e /array.c
parent82cfc630837475f186331a76eb2425401497fe7b (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.c38
1 files changed, 25 insertions, 13 deletions
diff --git a/array.c b/array.c
index 14edc9bad9..50c8bd0b89 100644
--- a/array.c
+++ b/array.c
@@ -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) {