ruby-trunk-changes r49990 - r50008

今日は r50000 のコミットがありました。また (+0.0).hash と (-0.0).hash の値を同じにする変更がありました。

kazu: r49990 2015-03-18 00:30:33 +0900

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

ko1: r49998 2015-03-18 05:38:02 +0900

オブジェクトのフラグ(struct RBasic::flags)に STR_FAKESTR というフラグを追加して ObjectSpace で管理されていない fake string にこのフラグを立てて STR_SET_SHARED() でこれを参照して不正な WriteBarrier処理をしないようにしています。

nobu: r49999 2015-03-18 12:01:58 +0900

浮動小数点数には +0.0 と -0.0 が別のものとしてあるのですが、hash メソッドでこれが別の値を返していたのですが、同じ値を返すようにしています。 +0.0 と -0.0 は数値として '==' で比較すると true を返すので同じハッシュ値にしないと一貫性が取れないということみたいです。うむ。まあ誤差のことなど考えると Float を Hash のキーに利用するのは(用途によりけりでしょうけど)あまりおすすめできないとは思います。 [ruby-core:68541] [Bug #10979]

svn: r50000 2015-03-18 12:02:33 +0900

r49999 のテストの行末の空白除去。 リビジョン番号 50000 は svn さんのコミットでした。

ko1: r50001 2015-03-18 12:08:09 +0900

r49998 でオブジェクトのフラグに STR_FAKESTR を追加した時のコメントに RSTRING_FSTR というフラグが漏れていたので追加しています。 fstring (frozen string) の時に立てるフラグですね。

ko1: r50002 2015-03-18 14:15:08 +0900

r49985 で追加/更新した WriteBarrier の影響をみる benchmark スクリプトで実行している ruby が 2.2 以降の時 GC.start(full_mark: false, immediate_mark: true, lazy_sweep: false) を入れて mark phase を終了させるようにしています。

nobu: r50003 2015-03-18 17:08:31 +0900

r49953 や r49963 の続きで make showflags で余分なターゲットがあったら消すようにする対象に prog, ruby, rubyw などを追加しています。

ko1: r50004 2015-03-18 17:12:44 +0900

RGENGC_CHECK_MODE が 1以上の時のデバッグ用のチェック関数 check_rvalue_consistency() でオブジェクトの年齢と mark 済みかどうかの整合性チェックで is_sweeping() のチェックは不要だったとのことで消しています。 LazySweep で段階的に sweep 処理中だとチェックしてなかったのですが、確かに不要そうですね。

ko1: r50005 2015-03-18 17:15:23 +0900

gc.c の static 関数 RVALUE_PROMOTE_RAW() を RVALUE_OLD_LONG_LIVED_SET() という名前に改名しています。

ko1: r50006 2015-03-18 18:02:10 +0900

RGenGC 用 Write Barrier の実装 gc_writebarrier_generational() で a -> b の参照で A が old object で b が new object の時に b が WB_PROTECTED なオブジェクトだったら promote して old object するという実装を #if 1 ... #else #endif でコメントアウトした状態で追加しています。結局現在の実装は変更されていません。ただ check_rvalue_consistency() の呼び出しを追加しています。 これ確か a が巨大な配列だったりした時にたくさん mark する必要ができるからということで…あれ逆か。 tarui さんがこれを逆にしたらどうかという提案をどこかでされてたような気が。
Twitter でこれに関連してそうなつぶやきがあったので記録しておきます。
https://twitter.com/_ko1/status/578064005236793346
https://twitter.com/_ko1/status/578111509143781377
https://twitter.com/_ko1/status/578111806280843264
https://twitter.com/_ko1/status/578111972647923712
https://twitter.com/_ko1/status/578112043598757888
https://twitter.com/_ko1/status/578116649259159553
https://twitter.com/_ko1/status/578120812860870656
https://twitter.com/_ko1/status/578120932008448000

[追記]日記にも解説がありました。 http://www.atdot.net/~ko1/diary/201503.html#d18 [/追記]

svn: r50007 2015-03-18 18:02:46 +0900

r50006 の ChangeLog エントリの行末の空白除去。

kazu: r50008 2015-03-18 19:04:34 +0900

r49985 と r50006 の ChangeLog エントリの typo 修正。