ruby-trunk-changes r37089 - r37097

今日は ObjectSpace.reachable_objects_from という、オブジェクトが参照しているオブジェクトの配列を返してくれる新機能が追加されています。

nobu:r37089 2012-10-05 09:26:43 +0900

拡張ライブラリ date の depend ファイルで依存関係に date_core.o と date_strftime.o には $(ruby_headers) への依存をつけていましたが、全てのオブジェクトファイルに $(ruby_headers) への依存関係をつけるようにしています。

svn:r37090 2012-10-05 09:26:46 +0900

version.h の日付更新。

nari:r37091 2012-10-05 16:20:49 +0900

昨日の r37082, r37083 あたりでファイナライザの実行前のあたりでファイナライザ自体の mark 処理を実行していたところを削っています。 しかしこれは後ほど revert されています。 ファイナライザは対象のオブジェクトが GC される場合に実行されるので、参照が失なわれてしまっている可能性があり、そこから参照しているオブジェクトも参照がなくなって GC で sweep されてしまうとファイナライザの実行に支障があるので、ファイナライザからの参照は mark して完了までは残しておかないといけないというようなことではないかと思います。

nari:r37092 2012-10-05 16:25:39 +0900

r37091 の ChangeLog エントリの修正をしています。

nobu:r37093 2012-10-05 16:28:32 +0900

make gdb-ruby という make ターゲットがあり gdb 経由で ruby を実行してくれるようなのですが、そのコマンドを tool/runruby.rb 経由で起動するようにしています。 runruby.rb のライブラリパスの設定を利用できるようにするためみたいです。

ko1:r37094 2012-10-05 17:14:09 +0900

ObjectSpace.reachable_objects_from というすてきなメソッドが追加されています。これはオブジェクトを指定するとそのオブジェクトから参照しているオブジェクトを含んだ配列を返してくれるもものです(ただし RObject::klass が 0 にセットされている内部的なオブジェクトは隠されています)。 実装は GC 用の mark 処理を流用していて、rb_objspace_t::mark_func_data というメンバに本来の mark 処理ではなくて別のコールバックを呼ばせるおうな設定を格納できるようにしておいて、それを使うようにしています。従って実際に GC した時にどのように mark されるかとほぼ一致するので、不正な参照やあるはずの参照がなくなっているという GC にまつわるバグの調査に威力を発揮しそうです。 [ruby-core:39772]
参照を取得中に(st_table に追加するので) GC が発生した時は一時的に rb_objspace_t::mark_func_data を退避しておいて GC を実行するので本来の mark 処理が実行されるので大丈夫となっています。
またいくつか小さな共通の処理を関数として切り出すリファクタリングもしています。 markable_object_p() に切りだしたのに同じ内容が展開されたままのところもありますね。

takano32:r37095 2012-10-05 17:20:34 +0900

template/Doxyfile.tmpl から Doxygen 1.8.2 で obsolete になっている設定を削除しています。

nari:r37096 2012-10-05 18:19:49 +0900

r37091 のファイナライザの mark 処理を消した変更を revert しています。

nari:r37097 2012-10-05 18:21:41 +0900

gc.c のファイナライザを mark している処理のコメントに mark が必要な理由を記述しています。