ruby-trunk-changes r47521 - r47538

今日は rdoc の更新、nil/true/false の frozen 化、GC 関連のリファクタリングなどがありました。

hsbt: r47521 2014-09-11 10:03:22 +0900

rdoc を 4.2.0.alpha の最新版 (21b241a) に更新しています。いくつか不具合修正があったみたいですね。

svn: r47522 2014-09-11 10:03:31 +0900

version.h の日付更新。

ko1: r47523 2014-09-11 14:37:32 +0900

nil, true, false などの即値オブジェクトが常に freeze された状態になる(frozen? メソッドが true を返す)ようにしています。 [ruby-core:57273] [Feature #8923]

ko1: r47524 2014-09-11 14:38:20 +0900

r47523 の ChangeLog にチケットの参照を追記しています。 [ruby-core:57273] [Feature #8923]

nobu: r47525 2014-09-11 15:13:57 +0900

r47523 のテストに true.frozen? などが true を返すことをチェックする assertion を追加しています。 [ruby-core:57273] [Feature #8923]

normal: r47526 2014-09-11 17:09:07 +0900

標準添付ライブラリ benchmark で時刻の計測のために Process.clock_gettime のクロックの種類に CLOCK_MONOTONIC_RAW が使えたらこれを優先的に利用するようにしていた r47320 および r47330 の変更を revert しています。 ARM で Benchmark.realtime のテストが失敗していたそうです。 [ruby-core:64744] [Bug #10202]
normalperson さんは計測には外部から調整された時計を使うべき派みたいですね。

hsbt: r47527 2014-09-11 17:45:47 +0900

r47526 の ChangeLog エントリで US-ASCII 以外の文字が含まれていたので変更しています。

ko1: r47528 2014-09-11 17:46:59 +0900

インクリメンタルGCの導入に伴い TracePoint のイベントの種類に RUBY_INTERNAL_EVENT_GC_ENTER と RUBY_INTERNAL_EVENT_GC_EXIT を追加しています。インクリメンタルGC では LazySweep と同様に細切れに mark 処理が走るようになるので、GC に関連した処理(mark, sweep)を実行する都度イベントを発生させることで GC 時間を正確に計測できるようにしています。
あれ、これまでは LazySweep のそれぞれの sweep で発火するイベントは存在しなかったんでしったっけ? r43997 で mark と sweep の全体の終了のイベントは追加されていましたが、1 heap ごとのイベントはなかったみたいですね。

hsbt: r47529 2014-09-11 18:15:42 +0900

coverage/README を追加して make test-all の coverage 測定の方法について記述しています。このため coverage/ ディレクトリごと .gitignore でリポジトリに入らないように無視させてたのを coverage/simplecov のみ無視するようにしています。

svn: r47530 2014-09-11 18:15:46 +0900

r47529 で新規追加されたファイルの svn property 設定。

hsbt: r47531 2014-09-11 18:40:21 +0900

r47529 での .gitignore の変更に追加で simplecov の出力結果も無視させるように追加しています。

ko1: r47532 2014-09-11 19:23:36 +0900

gc.c のリファクタリングgc_mark_ptr() を gc_mark_set() に、gc_mark() を gc_mark_ptr() に改名して、新たに gc_mark()関数を定義して is_markable_object() のチェックをここに掃き出しています。チェックが重複しないようにしているみたいです。

ko1: r47533 2014-09-11 19:34:09 +0900

VALUE の配列だと判っているメモリ領域を mark する rb_gc_mark_values() という関数を追加しています。 rb_gc_mark_locations() と比較して、ヒープ内を指すポインタかどうかの判定がないので高速になります。 vm.c の env_mark() で利用するようにしています。

ko1: r47534 2014-09-11 19:53:48 +0900

fatal や NoMemoryError、SystemStackError などの異状終了する系の例外オブジェクトを事前にインスタンスを作っておく処理を rb_vm_register_special_exception() という関数として抽出しています。

ko1: r47535 2014-09-11 20:23:16 +0900

VM の stack を markする時に、スタックポインタまでは rb_gc_mark_values() を使って mark するようにしています。 残りは rb_gc_mark_locations() を使って conservative に mark しています(元から)。

ko1: r47536 2014-09-11 20:56:29 +0900

NEWS ファイルにインクリメンタルGC の追加と GC.stat の変更、TracePoint のイベント追加などについて追記しています。

ko1: r47537 2014-09-11 20:59:15 +0900

NEWS ファイルに nil, true, false が freeze されたことを追記しています。

ko1: r47538 2014-09-11 21:01:38 +0900

r47536 の NEWS の追記の TracePoint イベント追加について関連するリビジョン番号を追記しています。