ruby-trunk-changes r37303 - r37316

今日は ObjectSpace.reachable_objects_from に内部オブジェクトの情報も返せるようにする機能拡張などがありました。

tenderlove:r37303 2012-10-24 02:46:33 +0900

instance_exec のブロック引数に Proc#curry で引数を一部渡されてできた Proc オブジェクトを渡すテストを追加しています。特にチケット等の参照はないですけどなにに由来したテストでしょうか。
[追記] @znz さんに教えていただきました。 ruby-forum で JRuby の不具合として報告されていた事例のぶんのテストのようです。 http://www.ruby-forum.com/topic/4407005 [/追記]

ko1:r37304 2012-10-24 05:34:25 +0900

VM からのメソッド呼び出しに関する関数 vm_call0_body() の最後に呼んでいた割り込みチェックの RUBY_VM_CHECK_INTS() を削除しています。また switch 文の break を直接 break に変更して、メソッドの種別の分岐に VM_METHOD_TYPE_CFUNC_FRAMELESS と VM_METHOD_TYPE_UNDEF を追加しています。

ko1:r37305 2012-10-24 05:42:45 +0900

eval_error.c, vm_eval.c, vm_trace.c で PUSH_TAG()/EXEC_TAG()/POP_TAG() のかわりに TH_PUSH_TAG()/EXEC_TAG()/POP_TAG() など rb_thread_t* を引数に受け取るマクロを利用するようにリファクタリングしています。 th は current_thread なので内容に変化はないと思います。

ko1:r37306 2012-10-24 05:53:35 +0900

vm_call_method() でも switch 文のメソッド種別に VM_METHOD_TYPE_UNDEF の case を追加して、default ラベルは削除しています。

ko1:r37307 2012-10-24 09:04:56 +0900

r37094 で追加された ObjectSpace.reachable_objects_from に内部オブジェクトも ObjectSpace::InternalObjectWrapper というクラスのオブジェクトとして返すように仕様が追加されています。まだ動作確認していないので多分ですが間接的な参照ではなく直接参照を持っているオブジェクトの一覧を返します。

ko1:r37308 2012-10-24 10:21:13 +0900

r37307 で追加した ObjectSpace::InternalObjectWrapper に internal_object_id メソッドを追加して、reachable_objects_from が返した内部的オブジェクトの object_id を取得できるようにしています。

ko1:r37309 2012-10-24 10:39:45 +0900

ObjectSpace.reachable_objects_from のために GC のマーク処理を利用していて、そのためのフラグというか関数ポインタを本当の GC が始まった時にはバックアップして一時的に無効にする処理を garbage_collect() から gc_marks() 関数に移動しています。 gc_marks() は lazy_sweep でオブジェクトのスロットを確保するために gc_prepare_free_objects() からも呼ばれるので、こちらに置いておかないといけなかったのだと思います。

ko1:r37310 2012-10-24 12:00:39 +0900

ObjectSpace.reachable_objects_from が返す配列を作るために内部で作るハッシュテーブルの構造を、キーにオブジェクトを使っていたのをやめて、キーに object_id を入れて値にそのオブジェクトを格納するようにしています。

nari:r37311 2012-10-24 12:55:46 +0900

gc_lazy_sweep() を free_object_aquire() に改名しています。空きスロットをつくりたくて呼ぶという意図をより表した名前にしています。

nari:r37312 2012-10-24 13:14:22 +0900

r37211 で改名した free_object_aquire() をさらに gc_aquire_free_object() に改名しています。

nari:r37313 2012-10-24 13:29:53 +0900

r37311, r37312 からさらに gc_prepare_free_objects() という名前に変更しています。 acquire という単語が free と並んでいると誤解しそうだからみたいです。ちなみに aquire と typo していましたね。

ko1:r37314 2012-10-24 17:46:01 +0900

benchmark/driver.rb に -x/--exclude オプションを追加しています。オプションの引数に指定したパターンにマッチするファイル名のベンチマークを実行しないようにしています。

nobu:r37315 2012-10-24 18:48:32 +0900

vm_insnhelper.c の vm_call_iseq_setup_normal()、 vm_call_iseq_setup_tailcall()、vm_call_method() に明示的な inline 指示子をつけています。

nobu:r37316 2012-10-24 18:49:18 +0900

拡張ライブラリ objspece で ObjectSpace::InternalObjectWrapper ために切り出した関数 type2sys() でオブジェクトの型情報をシンボルに変換する時に int ではなくて enum ruby_value_type 型で指定するようにリファクタリング