ruby-trunk-changes r46720 - r46751

今日は st_update() の不具合(?)修正や、fstring や dynamic symbol など共有オブジェクトを管理するしくみが LazySweep で回収予定のオブジェクトと同値のオブジェクトを登録しようとした時に rb_gc_resurrect() で復活させていたのをやめる変更がありました。なんか説明がくどいですね。

nobu: r46720 2014-07-06 23:19:47 +0900

st_lookup() と st_insert() を同時に行う関数 st_update() でコールバック関数が ST_CONTINUE を返してさらにキーが変更された時にエラー処理するようにしています。元々 st_update() が導入された時はコールバック変数の key 引数は値渡しでしたが、r35172 で st_update() で新しい要素を追加する時にキーを指定できるようにするためポインタで渡すようになったので、このポインタの指す先を変更しつつ新規追加ではない時に key を書き換えるようにしています。ただし st_table のキーとして同一視できないようなキーが返された時(hash値が異なるかテーブル毎の compare() 関数で比較して同一でない)はエラーにしています。 これは 2.1 にも必要かなぁ。 2.0.0 はどうですかね。ぎりぎり入ってないかも。

nobu: r46722 2014-07-06 23:42:57 +0900

r46720 と同様だと思うのですが st_update() で新規追加時も key が更新されていたら改めてテーブルに追加するために使う hash 値を計算しなおすようにしています。

nobu: r46723 2014-07-07 00:11:53 +0900

r46720 の st_update() の変更で更新された key が元の key と同値(その st_table の基準で)であることのチェックは削って、key は更新してもいいけど同値であることはコールバック関数の責任とするようにコメントを追加しています。毎回チェックすると遅くなるからでしょうかね。

svn: r46724 2014-07-07 00:13:44 +0900

version.h の日付更新。

nobu: r46725 2014-07-07 00:22:19 +0900

st_update() の goto でジャンプした時に未初期化のまま使用される可能性のあった変数の初期化追加。

ko1: r46726 2014-07-07 00:42:14 +0900

昨日 r46716 で is_dead_object() から is_dying_object() に改名された関数をさらに is_garbage_object() に改名しています。 また rb_objspace_dying_object_p() も rb_objspace_garbage_object_p() に改名しています。

ko1: r46727 2014-07-07 02:20:30 +0900

fstr_update_callback() で fstring に使っていた文字列が GC で回収予定(LazySweep により実際の sweep はまだされていない)時に同値の fstring を作ろうとした時に rb_gc_resurrect() で復活させるのはやめて、rb_objspace_garbage_object_p() で判定して回収予定だったら新たに文字列オブジェクトを生成してそれを使うようにしています。なるほど、どうせタイミング次第では作りなおしになってたはずなので新規に作ってしまってもいいはず、というかそのほうが素直な実装ですね。

nobu: r46728 2014-07-07 08:47:17 +0900

r46727 の fstr_update_callback() で新しい String オブジェクトを作る時に回収予定のオブジェクトを元に作るのではなくて引数に与えられた文字列オブジェクトを元にするようにしています。また rb_fstring() で不要なローカル変数を削除して引数を使いまわすようにしています。

ko1: r46729 2014-07-07 10:53:54 +0900

r46727 と同様に dynamic symbol のテーブルでも sweep 予定のオブジェクトと同じ Symbol 名の登録があった時に rb_gc_resurrect() で復活させるのではなくて新規にオブジェクトを作成するようにしています。

naruse: r46730 2014-07-07 11:07:01 +0900

lib/rbconfig/obsolete.rb を削除して tool/mkconfig.rb からの autoload による require も削除しています。こんなファイル知りませんでしたが、ruby-1.8.4 以前との互換性のため、と書かれてますね。

ko1: r46737 2014-07-07 12:42:42 +0900

r46729 の変更で rb_pin_dynamic_symbol() で戻り値が引数から変化する可能性ができたので、呼び出し元で戻り値を受け取るように修正しています。
あと RGENGC_CHECK_MODE を 3 にしたままコミットしてしまっています。

ko1: r46740 2014-07-07 12:46:15 +0900

r46737 で RGENGC_CHECK_MODE を 3 にしてしまっていたのを 0 に戻しています。

ko1: r46749 2014-07-07 14:36:25 +0900

parse.y の global_symbols::pinned_dsym と global_symbols::pinned_dsym_minor_marked メンバを削除しています。 pindown された dynamic symbol は rb_gc_register_mark_object() で登録してそちらから mark するようにして、独自のテーブルに参照を保持するのはやめています。一度 pindown されるとそのプロセスではその Symbol はずっと存在し続けるので解除できない rb_gc_register_mark_object() でいいということ。昨日の r46714 で rb_vm_t::mark_object_ary をネストした配列にして大量のオブジェクトが登録された時のパフォーマンスの改善を行った(多分)のもこの布石だったんですかね。

nobu: r46750 2014-07-07 16:08:06 +0900

make のターゲット clean-rdoc, clean-capi, clean-platform のルールは Makefile.in および win32/Makefile.sub でそれぞれ記述されていたのを common.mk に移動しています。また Windows コマンドライン環境での rmdir の wrapper の win32/rmall.bat を削除しています。かわりに rm.bat に -r オプションを付けて呼ぶようにしています。

nobu: r46751 2014-07-07 17:42:57 +0900

test/ruby/find_executable.rb というファイルを追加してテスト用のユーティリティモジュール EnvUtil に find_executable という、環境変数 PATH から実行可能なファイルパスを探すメソッドを追加して、test/ruby/test_rubyoptions.rb で ps コマンドが呼べるかどうかのチェックに利用するようにしています。 デフォルトで呼ばれる ps ではないところにオプションに対応した ps があったらそれを使うようにしているという感じでしょうか。