ruby-changes:10177
From: matz <ko1@a...>
Date: Thu, 22 Jan 2009 00:33:23 +0900 (JST)
Subject: [ruby-changes:10177] Ruby:r21721 (ruby_1_8): * array.c (ary_double_capa): a new function to expand array more
matz 2009-01-22 00:33:06 +0900 (Thu, 22 Jan 2009) New Revision: 21721 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=21721 Log: * 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. Modified files: branches/ruby_1_8/ChangeLog branches/ruby_1_8/array.c Index: ruby_1_8/array.c =================================================================== --- ruby_1_8/array.c (revision 21720) +++ ruby_1_8/array.c (revision 21721) @@ -43,6 +43,29 @@ } } +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_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 @@ } 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) { Index: ruby_1_8/ChangeLog =================================================================== --- ruby_1_8/ChangeLog (revision 21720) +++ ruby_1_8/ChangeLog (revision 21721) @@ -1,3 +1,12 @@ +Wed Jan 21 17:25:41 2009 Yukihiro Matsumoto <matz@r...> + + * 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. + Wed Jan 21 15:43:19 2009 Nobuyoshi Nakada <nobu@r...> * enumerator.c (inspect_enumerator, yielder_new_i): added -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/