From: "K.Kosako" Date: 2001-12-11T17:58:43+09:00 Subject: [ruby-dev:15422] Re: inconsistency of STR_ASSOC Yukihiro Matsumotoさんの<1008004491.917579.20216.nullmailer@ev.netlab.jp>から > |gc.c (STR_ASSOC): use FL_USER3 instead of FL_USER2. > > ううう、すいません。大きな変更をするとポカが目立ちますね。 偶然見付けただけです。 変更量の割に、間違いは非常に少ないのではないかと思います。 Array#popのときにキャパシティの縮小を行っていますが、 データ共有しているとまずいのでチェックが必要と思います。 (今回は、スクリプトによる確認は省略しました。風邪気味なので手抜きです。) array.c (rb_ary_pop): should ELTS_SHARED flag check before REALLOC. --- array.c.orig Tue Dec 11 12:48:08 2001 +++ array.c Tue Dec 11 17:39:16 2001 @@ -336,7 +336,9 @@ { rb_ary_modify_check(ary); if (RARRAY(ary)->len == 0) return Qnil; - if (RARRAY(ary)->len * 10 < RARRAY(ary)->aux.capa && RARRAY(ary)->aux.capa > ARY_DEFAULT_SIZE) { + if (!FL_TEST(ary, ELTS_SHARED) && + RARRAY(ary)->len * 10 < 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); } -- 小迫@ソフネック 渋谷区恵比寿1-15-1