ruby-trunk-changes r47561 - r47576

今日は Process.detach が特異クラスを生成せず Process::Waiter という Thread のサブクラスを利用するようにする変更や freeze と特異クラスについての再修正、その他細かな最適化などがありました。

normal: r47561 2014-09-13 04:42:01 +0900

Process.detach で子プロセスの終了を待つ Thread を内部的に生成してその pid メソッドを特異メソッドとして生成していたのをやめています。かわりに Thread を継承して pid メソッドのみ追加した Process::Waiter クラスというのを導入して、作成した Thread のクラスをこの Process:Waiter にすりかえることで pid メソッドが呼べるようにしています。 特異クラスを使い捨てられるオブジェクトに対して生成するとそれが GC される時にメソッドキャッシュがクリアされて非効率なため、とのことですが今って hierarchical method cache が導入されてるんじゃなかったっけ、と思ったけどパフォーマンス悪化のため r43027 で revert されて今に至るって感じですね。 [ruby-core:64972] [Bug #10231]

normal: r47562 2014-09-13 05:57:45 +0900

Proc オブジェクトを確保する rb_proc_alloc() 関数を klass だけでなく rb_block_t、envval, blockprocval, safe_level, is_from_method, is_lambda などの引数も追加して初期化処理をまとめています。 0 クリアを含む ZALLOC() を使う TypedData_Make_Struct() で構造体のメモリ確保していたのを ALLOC() を使って確保して必要な初期化を 0 セットも含めて全て行うことで、確保時の 0クリアのコストを抑える最適化が目的のようで、lambda を生成するベンチマークも同時に追加しています。 [ruby-core:64994] [Bug #10212]

svn: r47563 2014-09-13 05:58:04 +0900

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

normal: r47564 2014-09-13 06:34:12 +0900

Proc オブジェクトの開放関数 proc_free() を削除してデフォルトの free 実装にしています。 構造体ポインタが NULL の場合を考慮したコードになっていたのですが、TypedDataStruct で ptr が NULL になることはないので不要な分岐を削除しています。

normal: r47565 2014-09-13 06:34:25 +0900

thread_alloc() の obj 変数の volatile 修飾子を削除しています。不要っぽいのになぜかついてました。

nobu: r47566 2014-09-13 09:47:02 +0900

Object#to_enum のテストで Object のインスタンスに特異メソッド each を追加してテストすべきところうっかり Object クラスそのものでテストしてしまっていたのを修正しています。

normal: r47567 2014-09-13 09:48:36 +0900

man/ruby.1 の各種 ruby-lang.org のサイトの URL の schema を https に変更しています。

nobu: r47568 2014-09-13 10:22:01 +0900

昨日の r47551 および r47557 の続きで Object#freeze で特異クラスを freeze するようにした変更で、オブジェクトが freeze されている時に特異クラスのメソッド追加しようとした時の例外メッセージを修正しています。

nobu: r47569 2014-09-13 10:28:57 +0900

parse.y の関数マクロ intern_cstr_without_pindown() を intern_cstr() と改名しています。また ripper でない時の実装も rb_intern_cstr_without_pindown() から rb_intern3() に変更していて、これだともう RIPPER での分岐は不要になっていますが、"for the time being" とあるのでまた変更するのかも。 [ruby-core:65009] [Bug #10206]

suke: r47570 2014-09-13 11:28:47 +0900

拡張ライブラリ win32ole で WIN32OLE_EVENT で COM サーバへの参照カウンタをインクリメントし忘れていて SEGV する可能性があったのを修正しています。

normal: r47571 2014-09-13 13:44:08 +0900

doc/NEWS-2.0.0 の Fiber のデフォルトスタックサイズについての記述の typo 修正。

normal: r47572 2014-09-13 14:14:51 +0900

exec_arg_data_type、autoload_data_type、location_data_type などの TypedDataStruct 型でも ptr が NULL のチェックが不要なため独自の free 関数を削除しています。

normal: r47573 2014-09-13 15:17:58 +0900

class.c で xmalloc() を直接利用していたところを ALLOC() マクロの利用に変更しています。 型で検索した時に確保している場所が検索しやすいという理由だそうです。なるほどなぁ。

nobu: r47574 2014-09-13 22:03:46 +0900

r47551、r47557、r47568 などの更に続きで、特異クラスを直接 freeze した時に、そのさらに特異クラスも freeze されてしまうのを防いでいます。ややこしいですが、オブジェクトを freeze するとその特異クラスも freeze されますが、freeze された特異クラスのさらに特異クラスを生成した時にそれは freeze しないようにしています。このため struct RBasic::flags に FL_FREEZE をセットする処理を OBJ_FREEZE_RAW() マクロとして定義しています。

nobu: r47575 2014-09-13 22:07:04 +0900

ついでに singleton_class_of() の条件分岐を整理するリファクタリングをしています。

nobu: r47576 2014-09-13 22:19:27 +0900

Hash#store の rdoc 用コメントのサンプルの戻り値の記述が間違っていたのを修正しています。 副作用としての Hash オブジェクトの結果を戻り値のように書いてしまっていました。 https://github.com/ruby/ruby/pull/715