ruby-trunk-changes r50676 - r50691

今日はインスタンス変数の管理方法の変更や alias の実装方法の変更など内部的にけっこう大きな変更がいくつかありました。

normal: r50676 2015-05-30 08:22:40 +0900

T_OBJECT 型のオブジェクトのインスタンス変数用のテーブルの操作を関数(iv_index_tbl_make(), iv_index_tbl_extend(), iv_index_tbl_newsize())に切り出すリファクタリング。後の r50678 での T_DATA 型オブジェクトの変更で再利用するための準備みたいです。 [ruby-core:69323] [Feature #11170]

svn: r50677 2015-05-30 08:22:53 +0900

version.h の日付更新。

normal: r50678 2015-05-30 08:42:49 +0900

r50676 で切り出された関数群を利用して、T_DATA など T_OBJECT のように struct RVALUE 内にインスタンス変数用のテーブルを持っていないオブジェクトが静的な generic_iv_tbl という変数でインスタンス変数を保持していたのを、T_OBJECT 型と同様にクラス毎にインスタンス変数名からインデックスへのマップを保持するようにして、st_table のかわりに配列でインスタンス変数の値を保持するように変更しています。 おおー。同じクラスでインスタンス毎にインスタンス変数名をかえて作るとインデックス管理のテーブルが伸長して、多分それは縮められないので、Symbol が GC できなかったのと同様な DOS 攻撃の対象にならないかちょっと心配です。 [ruby-core:69323] [Feature #11170]

nobu: r50679 2015-05-30 09:14:34 +0900

Continuation の解放処理 cont_free() で GET_THREAD() で取得した ruby_current_thread が NULL になって SEGV することがあるのでチェックを追加しています。うーむ、issue では報告者は Thread が Fiber より先に解放されたからじゃないかとか推測していますが、ruby_current_thread が NULL になるなのは終了時くらいのはずでなにかおかしいのでは…と思いましたが、とにかく NULL dereference を回避したということでしょうか。 https://github.com/ruby/ruby/pull/914

normal: r50680 2015-05-30 09:20:15 +0900

r50678 のインスタンス変数の実装の変更で Marshal.dump/load の速度に影響していたのを改善しているそうです。なんで速くなるのかよくわかりませんが…。
が、なんかついでに rb_attr_delete() っていう C-API が追加されてて、これはなんだろうかと思ったら、time.c の time_mload() で load 対象の文字列オブジェクトからインスタンス変数を取得するたびにそれを消すということを(なぜか)していて、その処理を一般化したみたいです。なんだろこれ…。 [ruby-core:69323] [Feature #11170]

svn: r50681 2015-05-30 09:20:48 +0900

r50680 で追加されたベンチマークスクリプトsvn property 設定。

glass: r50682 2015-05-30 10:29:48 +0900

標準添付ライブラリ tempfile のリファクタリング。 @unlinked という削除済みを表すフラグのインスタンス変数を導入してかわりに @tmpname を削除したり、内部的なクラスの Tempfile::Remover の受け取る引数の変更など。 r50684 および r50686 で追加修正されてます。

tenderlove: r50683 2015-05-30 11:04:26 +0900

doc/dtrace_probes.rdoc および probes.d で probe 名の "ruby::function-entry" を "ruby::method-entry" に改名しています。ふむ、一応これも非互換と言えなくはないので NEWS に書いたほうがいいのかなぁ。

usa: r50684 2015-05-30 16:01:29 +0900

r50682 の tempfile.rb のリファクタリングで導入されたインスタンス変数 @unlinked を #initialize で false に初期化するようにしています。多分未初期化インスタンス変数の参照で警告が出て、その影響でテストが失敗するようになっていたのではないかと。

normal: r50685 2015-05-30 17:19:37 +0900

拡張ライブラリ socket の ext/socket/ancdata.c bsock_sendmsg_internal() で変数に volatile をつけるかわりに RB_GC_GUARD() でコンパイラの最適化避けを行うようにしています。 [ruby-core:69419] [Feature #11198]

usa: r50686 2015-05-30 18:05:50 +0900

r50682 の tempfile.rb の変更で条件が反転していたところを修正しています。

ko1: r50687 2015-05-31 03:30:42 +0900

rb_free_method_entry() の引数の型に const を追加した、vm_core.h から不要になっていた rb_unlink_method_entry() の宣言を削除したりといった細かな変更です。

svn: r50688 2015-05-31 03:31:09 +0900

version.h の日付更新。

ko1: r50689 2015-05-31 03:34:16 +0900

r50687 の ChangeLog エントリの冗長な行を削除しています。

ko1: r50690 2015-05-31 03:35:21 +0900

r50687 で vm_core.h から宣言を削除した vm_method.c の rb_unlink_method_entry() を static 関数に変更しています。

ko1: r50691 2015-05-31 03:45:28 +0900

alias が include/extend している Module や継承している Class で定義されているメソッドに対する別名を定義していて、そのメソッド内で super した時にメソッドがみつからないことがある不具合を修正しています。
alias で定義する対象のメソッドが別の Module/Class で定義されているものだった時に VM_METHOD_TYPE_ALIAS という新たなタイプの method entry を作るようにしています。 [ruby-dev:48992] [Bug #11173]