ruby-trunk-changes r36656 - r36663

今日は YARV の InstructionSequence (命令列)の命令の削除、追加がありました。 YARV マニアは必見です。また instance_eval での定数探索の修正がありました。

drbrain:r36656 2012-08-08 05:51:48 +0900

Method#clone の rdoc を追加しています。

svn:r36657 2012-08-08 05:51:51 +0900

version.h の日付更新。

ko1:r36658 2012-08-08 16:52:19 +0900

rescue 節の例外の指定に Module 以外のオブジェクトを置いてもエラーにならないという問題を修正するために、YARV の InstructionSequence に新しい命令 checkmatch を追加して、そのかわりこれまで case 文の when や rescue 節の例外のマッチに使っていた checkincludearray という命令を削除しています。 checkmatch はスタックから目的のオブジェクトと比較対象のオブジェクトを取り出し、比較対象が配列だったらその配列内に Object#=== でマッチするオブジェクトが存在するか、配列でなかったらその比較対象自体とマッチするかを判定する命令で、さらにオペランドのフラグで指定されると比較対象が Module 型でないと例外を発生させるようなことをしています。 [ruby-core:35364] [Bug #4438]
また命令の削除/追加という大きな変更があったので InstructionSequence のメジャーバージョンを増やして 2.0 にしています。 ISeq をダンプして保存して遊んだりしていた人は互換性がなくなるので注意しましょう(そんなに居ないと思うけど)。

ko1:r36659 2012-08-08 17:11:12 +0900

r36658 のテストで rescue の動作を確認するのに実際に raise していなくてテスト失敗していたのを修正しています。

ko1:r36660 2012-08-08 17:12:24 +0900

compile.c で命令列のコンパイル中のリストにラベルを挿入する関数マクロ(ADD_INSNL) が ADD_INSN1() とまったく同じ内容だったので別名として定義(ADD_INSN1 に展開するように)しています。

nobu:r36661 2012-08-08 22:45:41 +0900

r36571 で parse.o の id.h への依存の追加は実は $ID_H_INCLUDES という変数で定義されていたので不要だったので revert して、 parse.c と parse.y の依存と parse.h と parse.y の依存関係を別々のルールで定義するようにして id.h が更新されない不具合を回避しているようです。また変更がない時に id.h を更新しないようにしています。 [ruby-core:46741] [Bug #6789]

nobu:r36662 2012-08-08 22:46:09 +0900

test/ruby の下のいくつかのテストで無駄にグローバル変数を使っていたものをローカル変数を使うように変更しています。

nobu:r36663 2012-08-08 22:51:32 +0900

Object#instance_eval に文字列を渡して評価する時に定数の探索をそのオブジェクトのクラスから始めさせるようにしています。もともと eval でフレームを積む時には cref にフラグを付けておいて定数探索時にそのフレームはスキップさせるようなしくみがあるのですが、instance_eval の場合にはそのフラグを付けないようにしています。