ruby-trunk-changes r44225 - r44250

今日は GCデバッグ機能まわりと ObjectSpace の不具合修正などが主でした。また、まだ実質コメントアウトされた状態ですが Hash#reject の仕様変更をとりやめることも可能なように準備されていました。

tmm1:r44225 2013-12-16 11:50:45 +0900

旧世代のメモリ使用量を GC トリガにする機能を制御するマクロ RGENGC_ESTIMATE_OLDMALLOC が 0 の時の条件分岐が足りなくてビルドエラーになっていたのを修正しています。

svn:r44226 2013-12-16 11:50:51 +0900

version.h の日付更新。

tmm1:r44227 2013-12-16 11:51:25 +0900

r44225 の ChangeLog エントリの typo 修正。

ko1:r44228 2013-12-16 13:12:48 +0900

GC の(おそらく主に RGenGC の)デバッグ用のメソッドで GC.verify_internal_consistency というのを追加しています。 RGenGC の世代のオブジェクトの flags とビットマップの一貫性チェックをしているそうです。チェックに失敗したら rb_bug() で強制終了するみたいなのでまあ通常は呼ぶことはなさそうですね。

naruse:r44229 2013-12-16 14:03:56 +0900

$SAFE = 3 を使った Thread#safe_level のテストで警告を抑制しています。 $SAFE = 3 って -w オプション付きだと警告が出るんですね。

naruse:r44230 2013-12-16 14:04:03 +0900

Process.clock_gettime で結果の単位を指定するシンボルに :second を追加しています。 :second_float はあったのですが整数で秒単位で結果を取得できなかったので追加しています。

ko1:r44231 2013-12-16 14:18:21 +0900

RGENGC_CHECK_MODE が 2以上の時の RGenGC のチェックの一部を r44228 で導入した gc_verify_internal_consistency() を使うように書き変えています。多分チェック内容は同じようなもので rb_bug() で死ぬようになったのが違うかも。

nobu:r44232 2013-12-16 14:21:05 +0900

r44231 の ChnageLog エントリの typo 修正。

a_matsuda:r44233 2013-12-16 15:11:48 +0900

r44228 の ChangeLog エントリの typo 修正。

ko1:r44234 2013-12-16 16:46:48 +0900

r44175 の include/prepend と alias の組み合わせの不具合修正で method entry の me->klass を代入しているところで method entry の所有者の Class からの参照の変更による Write Barrier 挿入漏れを修正しています。 このテストで GC.verify_internal_consistency が利用されています。

ko1:r44235 2013-12-16 18:01:49 +0900

拡張ライブラリ objspace の ObjectSpace.each_object での LazySweep を off にするフラグの設定を戻す時に強制的に on に戻していたので、再入した場合を考慮して変更前の値に戻すようにしています。

ko1:r44236 2013-12-16 18:05:57 +0900

拡張ライブラリ objspace の ObjectSpace.reachable_objects_from_root で利用されている rb_objspace_markable_object_p() で既に回収予定のオブジェクトなどは除外するように修正しています。

ko1:r44237 2013-12-16 18:07:52 +0900

r44236 のさらに追加修正。 変数参照が間違っていてコンパイル通らなかったようです。

ko1:r44238 2013-12-16 18:19:24 +0900

r44228 で追加した GC.verify_internal_consistency の実装で全オブジェクトをスキャンするのに rb_objspace_each_objects() を呼んでいたのを objspace_each_objects() を直接利用するようにしています。 rb_objspace_each_objects() は rest_sweep() を呼んでしまうためだそうです。

nobu:r44239 2013-12-16 18:21:05 +0900

r44238 の ChangeLog の行末の空白除去。

a_matsuda:r44240 2013-12-16 19:09:10 +0900

sample/exyacc.rb の変数名の typo 修正。

ko1:r44241 2013-12-16 19:16:51 +0900

r44222 でとりあえずの対策をしていた問題の修正だと思うのですが、ObjectSpace.reachable_objects_from_root の返す Hash 自身も走査対象にしてしまって "can't add a new key into hash during iteration" という例外が発生していたのを修正しています。 戻り値に使う Hash を compare_by_identity を呼んで VALUE の値のみで比較するようにしています。あーなるほど別のオブジェクトが Hash の同じキーとして扱かわれてしまうとここの用途ではまずそうですね。 [ruby-core:59125] [Bug #9252]

ko1:r44242 2013-12-16 19:22:03 +0900

r44236 および r44237 のさらに追加修正で rb_objspace_markable_object_p() で is_markable_object() のほうを先にチェックするようにしています。 is_live_object() が引数の VALUE が即値ではないことを期待しているのでこの順序でないとまずかったみたいです。

nobu:r44243 2013-12-16 19:25:14 +0900

おもむろに IO.write のテストケースを追加しています。 なかったんですね。

nobu:r44244 2013-12-16 19:25:21 +0900

C 関数でメソッドの引数を解析する rb_scan_args() でオプション引数がなかった時に 0 ではなく Qnil を返すようにしています。 また r44243 で追加した IO.test のテストに不正なオプション引数を追加して TypeError のチェックをしていますが、これが rb_scan_args() の変更と関係しているのかよくわかりませんでした。

nobu:r44245 2013-12-16 21:21:24 +0900

r44230 で追加した Process.clock_gettime のテストで 32bit 環境だと整数の結果が Bignum になることがあるので Fixnum と比較するのではなくて整数の時は Integer と kind_of? の関係にあることをチェックするように修正しています。

nobu:r44246 2013-12-16 22:40:02 +0900

rb_hash() で hash 値の計算に goto を使って実質ループを書いていたのを while を使って書くようにリファクタリングしています。

nobu:r44247 2013-12-16 22:40:04 +0900

Hash#dup の関数 rb_hash_dup() から Hash の要素は空でその他の情報(class, default値、インスタンス変数、taint されているかなど)はコピーしたものを返す rb_hash_dup_empty() という処理を切り出して、Hash#reject で HASH_REJECT_COPY_TRIVIAL_ATTRIBUTES というマクロが真に定義されていたらこっちを使って Hash の空のコピーを生成するようにしています。 r44137 で Hash#rejectdup+reject! ではなくしてしまったのがまずくないかというのを受けて、その場合の対応を入れておいたというもののようで、今は HASH_REJECT_COPY_TRIVIAL_ATTRIBUTES は 0 で定義しているので r44137 の変更のままで Hash#reject は新しい(コピーではない) Hash を返しています。また #if 0 でコメントアウトした状態で Hash#rejectインスタンス変数やデフォルト値の指定のある Hash に呼ばれた時に警告を発生するようにするコードも追加されています。移行措置を設けることにした時のためのコードを準備しているようです。

nobu:r44248 2013-12-16 22:45:06 +0900

NEWS ファイルに Hash#reject の仕様変更について非互換性のところに追記しています。

kazu:r44249 2013-12-16 22:59:38 +0900

r43929, r43930, r43973, r43975(r43977 での追記部分), r44015, r44222 の ChangeLog エントリの typo 修正。

nobu:r44250 2013-12-16 23:36:14 +0900

r44247 で Hash#reject の挙動を変更するためのマクロ名が定義している部分と違っていたのを修正しています。