ruby-changes:10175
From: matz <ko1@a...>
Date: Thu, 22 Jan 2009 00:27:50 +0900 (JST)
Subject: [ruby-changes:10175] Ruby:r21719 (trunk): * array.c (ary_double_capa): a new function to expand array more
matz 2009-01-22 00:27:35 +0900 (Thu, 22 Jan 2009) New Revision: 21719 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=21719 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_unshift_m): ditto. * array.c (rb_ary_splice): ditto. Modified files: trunk/ChangeLog trunk/array.c Index: array.c =================================================================== --- array.c (revision 21718) +++ array.c (revision 21719) @@ -173,6 +173,21 @@ } 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_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 @@ 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 @@ } 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 @@ alen = RARRAY_LEN(ary) + rlen - len; if (alen >= ARY_CAPA(ary)) { - ary_resize_capa(ary, alen); + ary_double_capa(ary, alen); } if (len != rlen) { Index: ChangeLog =================================================================== --- ChangeLog (revision 21718) +++ ChangeLog (revision 21719) @@ -6,6 +6,17 @@ * ruby.c (load_file_internal): rests EOF flag to make possible to load from stdin after reading data. +Wed Jan 21 17:17:18 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_unshift_m): ditto. + + * array.c (rb_ary_splice): ditto. + Wed Jan 21 15:32:15 2009 Nobuyoshi Nakada <nobu@r...> * io.c (rb_io_ungetbyte, rb_io_ungetc): clears EOF flag. -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/