From: MORITA Naoyuki Date: 2006-07-13T13:34:16+09:00 Subject: [ruby-dev:29028] Array#pop での capa の縮小 森田と申します. とある条件下で ruby_xrealloc が異常な高頻度で呼ばれていたので調べてみ たところ, Array#pop で capa を縮めるコードに明らかにバグと思われる部 分があったので修正してみました. Index: array.c =================================================================== RCS file: /src/ruby/array.c,v retrieving revision 1.188 diff -u -r1.188 array.c --- array.c 24 Jun 2006 14:52:59 -0000 1.188 +++ array.c 13 Jul 2006 04:26:37 -0000 @@ -454,10 +454,11 @@ rb_ary_modify_check(ary); if (RARRAY(ary)->len == 0) return Qnil; if (!FL_TEST(ary, ELTS_SHARED) && - RARRAY(ary)->len * 2 < RARRAY(ary)->aux.capa && + RARRAY(ary)->len * 3 < RARRAY(ary)->aux.capa && RARRAY(ary)->aux.capa > ARY_DEFAULT_SIZE) { - RARRAY(ary)->aux.capa = RARRAY(ary)->len * 2; - REALLOC_N(RARRAY(ary)->ptr, VALUE, RARRAY(ary)->aux.capa); + + RARRAY(ary)->aux.capa = RARRAY(ary)->len * 2 ; + REALLOC_N(RARRAY(ary)->ptr, VALUE, RARRAY(ary)->aux.capa); } return RARRAY(ary)->ptr[--RARRAY(ary)->len]; } -- 東京大学 大学院 情報理工学系研究科 数理情報学専攻 数理第七(武市・胡)研究室 修士二年 森田 直幸