summaryrefslogtreecommitdiff
path: root/array.c
diff options
context:
space:
mode:
authormatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-05-21 07:50:27 +0000
committermatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-05-21 07:50:27 +0000
commitf827d9568507ed7b0f562be605a798a4ff0cf6f0 (patch)
tree47280358e5e58fe0ce2588b5f4f27becb46a8ffe /array.c
parenta5bbd5b8a55f855609b61afd7a97c50175a6e2a7 (diff)
* array.c (rb_ary_compact_bang): avoid forceful realloc.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@16504 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'array.c')
-rw-r--r--array.c8
1 files changed, 5 insertions, 3 deletions
diff --git a/array.c b/array.c
index 6fd7a75e01..f42eb9f826 100644
--- a/array.c
+++ b/array.c
@@ -2710,11 +2710,13 @@ rb_ary_compact_bang(VALUE ary)
if (NIL_P(*t)) t++;
else *p++ = *t++;
}
- if (RARRAY_LEN(ary) == (p - RARRAY_PTR(ary))) {
+ n = p - RARRAY_PTR(ary);
+ if (RARRAY_LEN(ary) == n) {
return Qnil;
}
- n = p - RARRAY_PTR(ary);
- RESIZE_CAPA(ary, n);
+ if (n * 2 < ARY_CAPA(ary) && ARY_DEFAULT_SIZE * 2 < ARY_CAPA(ary)) {
+ RESIZE_CAPA(ary, ARY_DEFAULT_SIZE * 2);
+ }
RARRAY(ary)->len = n;
return ary;