ruby-trunk-changes r51158 - r51174

今日は rb_iseq_t::klass の削除などで rb_iseq_t が実行時の情報を持たない、純粋にスクリプトコンパイル結果を持つ構造体になるという内部的には大きな変更がありました。VM のメソッド呼び出しまわりの実装がスッキリしたのではないかと思います。

hsbt: r51158 2015-07-06 17:27:41 +0900

test/lib/memory_status.rb で require_relative のパスが不要に親ディレクトリを辿っていたのを修正しています。

ko1: r51159 2015-07-06 17:35:22 +0900

rb_method_entry_location() を static 関数にして関数名も method_entry_location() に改名しています。 static でなかったといっても method.h で宣言されていたので内部的な関数で公開 API ではありませんでした。

hsbt: r51160 2015-07-06 18:00:21 +0900

拡張ライブラリ tk から $SAFE の廃止されたレベルのチェックを削除しています。 $SAFE = 4 のチェックも残ってましたね。

ko1: r51161 2015-07-06 18:02:34 +0900

Module が継承リストの中で2回 include されている時(普通に A と class B < A があって A が M を include していると B に include M しても include されないのですが、順番を逆にして B に include した後に A に include すると、[B, M, A, M, Object, Kernel, BasicObject] のような継承状態が作れるのです)、同じ Module のメソッドは繰り返し呼ばないようにしていたのですが、この処理も不完全で super で呼ばれるメソッドがモジュール(正確には Module の代理である IClass)の間のクラスなどに定義されていると、やっぱり繰り返し呼ばれます。
この特別扱いをやめて、同じ Module が(その IClass が)複数回継承リストに現われる時は super で辿ると同じメソッドが複数回呼ばれるようにしています。 [ruby-core:30450] [Bug #3351]
うむ、このほうがすっきりしますね。けど結構各所で影響あるんだろうなぁ。

kazu: r51162 2015-07-06 22:49:07 +0900

r51159 の ChangeLog エントリの typo 修正。

usa: r51163 2015-07-07 01:49:01 +0900

r51147 で追加された Array#sort! のメモリリークのテストで mswin の CI での失敗を回避するためしきい値を 1.25 に増やしています。

svn: r51164 2015-07-07 01:49:19 +0900

version.h の日付更新。

ko1: r51165 2015-07-07 01:54:56 +0900

fiber_init() で Fiber を作る時に control frame stack の底に1つ空の要素を予約しています。通常の実行には影響せずデバッグ用の出力にだけ影響するとのことですが。

ko1: r51166 2015-07-07 03:44:54 +0900

rb_iseq_t::klass メンバを削除して、super のメソッド定義を辿るのは r51126 で追加された rb_callable_method_entry_t を control frame stack から取り出して利用するようにしています。 r51161 で重複したメソッド呼び出しの skip をやめたのも関係あるんでしょうね。 [ruby-core:37116] [Bug #4881] [ruby-dev:40959] [Bug #3136]
vm_backtrace.c に #define VM_CHECK_MODE 2 というのが含まれたままコミットされてますけど、これはいいんですかね?

ko1: r51167 2015-07-07 03:48:10 +0900

vm_core.h から不要になった struct rb_iseq_struct の宣言を削除しています。

ko1: r51168 2015-07-07 04:08:05 +0900

rb_iseq_t::defined_method_id メンバも削除しています。これも rb_control_frame_t から対応するメソッドを取得するのに rb_callable_method_entry_t からかわりに必要な情報が取れるようになったので ISeq から取得する必要がなくなったそうです。

ko1: r51169 2015-07-07 04:13:18 +0900

r51166 および r51168 の削除で不要になった vm_define_method() のローカル変数 miseq を削除しています。

normal: r51170 2015-07-07 04:45:02 +0900

String#freeze の実装を rb_obj_freeze() から rb_str_freeze() と文字列専用の処理に変更しています。こちらのほうがバッファサイズの調整もするのでメモリの節約になります。

ko1: r51171 2015-07-07 11:27:41 +0900

rb_iseq_t に動的な情報が保持されなくなったため(やった!!)、Method などが ISeq オブジェクトを共有できるようになり、rb_iseq_clone() が不要になったので関数ごと削除しています。

ko1: r51172 2015-07-07 11:41:52 +0900

r51171 で rb_iseq_clone() が削除されたため rb_iseq_t::orig というコピー元を保持してたメンバも削除しています。

ko1: r51173 2015-07-07 11:52:34 +0900

struct METHOD::me の NULL チェックをしていたところをチェックせずに利用するようにしています。常に値が入っているはずなのでチェックは不要とのこと。

ko1: r51174 2015-07-07 12:08:08 +0900

r19890 で cont.c の cont_free() になぜか入ってた fflush(3) の呼び出しを削除しています。なんかデバッグ用に入れてたのが残ってたんでしょうね。