ruby-trunk-changes r52125 - r52132

今日は標準添付ライブラリ ostruct のメソッド定義遅延の再修正と、Symbol から Proc オブジェクトを作る時の不具合修正がありました。

eregon: r52125 2015-10-15 01:57:21 +0900

r51944 および r51947 の標準添付ライブラリ ostruct の OpenStruct の reader/writer メソッド定義の遅延の追加修正で、initialize と同様に initialize_copy や marshal_load でもメソッド定義を遅延させるようにして、また r51944 の時に指摘していたように respond_to? に対する挙動が変わってしまう対策として respond_to_missing? を定義するようにしています。また method_missing で @table には存在するけどまだ reader メソッドが定義されてない attribute の reader メソッドが呼び出された時にもメソッド定義するようにしています。 https://github.com/ruby/ruby/pull/1033 https://github.com/ruby/ruby/pull/1037

eregon: r52126 2015-10-15 01:57:46 +0900

r52125 で修正された OpenStruct に対する respond_to? でのチェックのテストを追加しています。 https://github.com/ruby/ruby/pull/1041

svn: r52127 2015-10-15 01:58:40 +0900

version.h の日付更新。

nagachika: r52128 2015-10-15 02:02:56 +0900

拡張ライブラリ objspace の ObjectSpace.trace_object_allocations_start と ObjectSpace.trace_object_allocations_stop でオブジェクト確保のトレースを on/off した時の ObjectSpace.allocation_sourcefile などで取得できるオブジェクトの確保された位置の情報を取得するメソッドのテストで、既に登録されているオブジェクト確保情報とたまたま object_id が一致してしまうと、トレースされないはずのタイミングのオブジェクトの情報が取れてしまう可能性があるので、まず ObjectSpace.trace_object_allocations_clear でクリアするようにしています。また、GC のタイミングによっても起きうるので、GC.disable しておくようにしています。 [ruby-dev:49095] [Bug #11271]

nobu: r52129 2015-10-15 13:37:26 +0900

Symbol からブロックを作る関数 rb_sym_to_proc() を string.c から proc.c に移動して、また rb_proc_new() で Proc オブジェクトを生成して rb_block_clear_env_self() を使って環境から切り離していたところを rb_proc_alloc() で 0 から Proc オブジェクトを生成することで、生成時のローカル変数の情報が漏れてしまっていたのを修正しています。 [ruby-core:71088] [Bug #11594]

nobu: r52130 2015-10-15 13:44:58 +0900

vm.c の env_mark() という rb_env_t を mark する関数で env->block.iseq が ifunc かどうかで分岐していまいたが、冗長だったのでただの RUBY_MARK_UNLESS_NULL() に置き換えるリファクタリング

nobu: r52131 2015-10-15 15:34:31 +0900

rb_block_min_max_arity() と rb_mod_define_method() で Symbol から作った ifunc の Proc かどうかの判定に RUBY_VM_IFUNC_P() を使っていたのを RUBY_VM_NORMAL_ISEQ_P() というマクロを使うように修正しています。また proc_binding() で RUBY_VM_IFUNC_P() と IS_METHOD_PROC_ISEQ() を両方チェックしていましたが、IS_METHOD_PROC_ISEQ() の定義が RUBY_VM_IFUNC_P() を含んでいるので冗長な条件を削っています。

nobu: r52132 2015-10-15 15:51:17 +0900

vm_dump.c で RubyVM レベルのバックトレースを出力するところで利用していない name という変数を削除しています。メソッド名を取得しているけど表示していなかったようです。