ruby-trunk-changes r50027 - r50038

今日は method_missing+respond_to_missing? で未定義のメソッドでも反応するようにしていた時の method 系メソッドで Method オブジェクトを作る時の不具合修正などがありました。

ko1: r50027 2015-03-19 21:26:49 +0900

r50023 で copy したオブジェクトが WB-unprotected だった時に RVALUE_DEMOTE() を呼ぶというのでコピー先でなくてコピー元を操作してしまっていたので修正しています。ついでに RGENGC_CHECK_MODE が 1以上の時のチェックも追加。

ko1: r50028 2015-03-19 22:13:46 +0900

r50027 で dest が WB-unprotected だったら rb_bug() で異常終了するチェックを追加していましたが、dest が WB-unprotected な可能性もあるということで単に条件分岐に追加するようにしています。今は rb_obj_clone() のところからしか呼ばれないから obj が WB-protected で dest が WB-unprotected という場合はあるのかなぁ。

ko1: r50029 2015-03-20 12:17:06 +0900

デバッグ用の関数 obj_info() で T_DATA 型のオブジェクトの型(TypedData の場合)を表示するようにしています。 また(クラスを持たない T_NODE と T_IMEMO 以外のオブジェクトでは)クラス名も表示するようにしています。

svn: r50030 2015-03-20 12:17:17 +0900

version.h の日付更新。

ko1: r50031 2015-03-20 12:41:10 +0900

obj_info() の変更ですが次の r50032 で revert されているので割愛。

ko1: r50032 2015-03-20 13:27:45 +0900

r50031 を revert しています。不要な変更が混ざってたとのこと。

ko1: r50033 2015-03-20 13:28:41 +0900

r50031 のリベンジ。obj_info() で klass が 0 の内部的オブジェクトにも対応するようにしています。

nobu: r50034 2015-03-20 16:14:38 +0900

xxx_method 系のメソッド名として Symbol と String を受け付けるメソッドで未定義のメソッド名を String で受け付けた時に不要に intern しないことを確認するテストで Module#singleton_method もテストするように追加しています。

nobu: r50035 2015-03-20 17:39:17 +0900

不要な intern をしないことを確認するテスト群で assertion のメッセージに共通 ML の番号を入れるつもりが feature = feature という自己代入になっててメッセージが nil になっていたのを修正しています。

hsbt: r50036 2015-03-20 17:39:57 +0900

.travis.yml でビルド対象のブランチから ruby_1_9_3 を外しています。これって確かそのブランチにこの変更を反映させないといけないんですよね。まあ、いずれにせよバックポートもしないでしょうから、いいのか…。

hsbt: r50037 2015-03-20 17:43:23 +0900

.travis.yml にメールでの通知を追加しています。

nobu: r50038 2015-03-20 18:41:06 +0900

BasicObject#method_missing (今気がついたんですけど method_missing って BasicObject にもあるんですね)で処理可能なメソッド名を Kernel#respond_to? でチェックした時に true にするために Kernel#respond_to_missing? というメソッドがあって、これにメソッド名を渡して true だったら respond_to? も true にするようになっています。で、これを拡張して respond_to_missing? で true を返すメソッド名については Kernel#method メソッドで Method オブジェクトを取り出すことができるらしいのですが、この時メソッド名の指定を String ですると取り出せなくなっていたのを修正しています。 [ruby-core:68564] [Bug #10985]
これてっきり機能追加だと思ったらチケットをみると元々こういうことはできて、2.2 系での regression の修正みたいです。実際にはそんなメソッドは定義されていないのですがまるでメソッドが定義されているかのように振る舞うようにしているようです。ちなみにこの時 Method#source_location はどこになるんだろうかと思ったら nil がかえってくるようです。