ruby-trunk-changes r36091 - r36104

今日は YARV の命令が1つ削除されて、VM のスタックフレームの使いかたが少し変更されています。

yugui:r36092 2012-06-15 09:03:56 +0900

NativeClient 用のエントリポイントのソースファイル nacl/pepper_main.c に存在しないヘッダの #include が残っていたのを削除しています。

nobu:r36093 2012-06-15 09:56:33 +0900

bootstraptest/runner.rb のヘルプメッセージに --color オプションの説明を追記しています。

nobu:r36094 2012-06-15 09:56:36 +0900

bootstraptest/runner.rb で --color オプションの引数が不正な値だったら警告メッセージを出力するようにしています。

nobu:r36095 2012-06-15 09:56:39 +0900

bootstraptest/runner.rb が色付けの指定を環境変数 PASSED_COLOR と FAILED_COLOR で受けつけていたのを TEST_COLORS という1つの環境変数にまとめて受け付けて ":" で分割するようにしています。

nobu:r36096 2012-06-15 09:56:41 +0900

bootstraptest/runner.rb で skip の時の色指定も受け付けるようにしています。また今まで failed の時と同じ色だったのでデフォルトで別の色をつけるようにしています。

nobu:r36097 2012-06-15 10:38:32 +0900

TEST_COLORS の解析の正規表現typo 修正しています。

nobu:r36098 2012-06-15 19:11:32 +0900

r35576 の Test::Unit::Runner#puke の再定義の変更を revert しています。 make test-all に TESTS 環境変数で "-j" オプションを渡すと常に skip の情報が抑制されていたのを修正しているそうです。 [ruby-dev:45746] [Bug #6595]

ko1:r36099 2012-06-15 19:22:34 +0900

YARV の finish 命令を削除して VM のループを抜けるのを leave 命令で行なうようにしています。コミットログにかなり詳細に背景と変更理由が書かれていますのでそれを読めばだいたいわかると思います。
[追記]ささださんの日記に詳しい解説がありましたのでこれを読むといいと思います。
http://www.atdot.net/~ko1/diary/201206.html#d15
[/追記]
なのでちょっと前提となる知識を書くと、YARVVM 処理というのは ISeq (Instruction Sequence)と呼んでいる命令列を順に(もちろん分岐やメソッド呼び出しはある)実行する大きなループになっています((まあ実際にはコンパイラがサポートしていたらシンプルなループではなくて、各命令後に次の命令の処理のアドレスまで直接ジャンプするようなことをしてたりもしますが)。Ruby のメソッドの呼び出しはこのループの中に閉じていて、VMのスタックフレーム(マシンスタックとは別物)を積んだり降ろしたりはしますが C の関数レベルでは同じ関数の中ぐるぐるループを回っていることになります。
そこから C で書かれたメソッドを呼びだすと、当然ながら C の関数を呼びます。でそこからさらに Ruby で書かれたメソッド(とかブロックとか)を呼ぶと、新たに VM ループを実行する関数を呼んでネストした VM 処理が走りはじめます。で最後のスタックフレームを取り除く(つまり呼び出された Ruby のメソッドから抜ける時)はこの VM ループ自体から抜けて、その関数から return しないといけません。その仕組みとしてこれまでは Ruby の処理を開始する時にかならずスタックフレームの底に finish という命令だけを含むフレームを積んでおいて、これが実行されると VM のループから抜けるという処理にしていました。
このコミットではこの finish 命令を廃止して、leave(メソッドなどから返る、スタックフレームを取り除く命令)でループを止めることができるようにフレームのフラグに VM_FRAME_FLAG_FINISH というのを追加しています。そもそも finish を導入したのには leave でこのようにフラグをチェックすると分岐が入るのでパフォーマンスが悪くなるというのを気にしていたようですが、最近の CPU の分岐予測能力は高いのであまり気にしなくていいのかもしれないというのと、finish を使うとフレームを常に1つ余分に使うのとスタック操作が入ることになるのでそんなにパフォーマンス面でも有利ではないかもしれないというので方針変更することにしたようです。

kazu:r36100 2012-06-15 21:01:41 +0900

ChangeLogvm.c のコメントの typo 修正しています。

kazu:r36101 2012-06-15 21:01:45 +0900

vm_backtrace の backtreace_collect() という関数名を backtrace_collect() に typo 修正する改名リファクタリングしています。

tenderlove:r36103 2012-06-16 01:29:55 +0900

psych のバージョン (Psych::VERSION) を 1.3.2 から 1.3.3 へ上げて、psych.gemspec も変更しています。ライブラリの内容には変化ありません。

svn:r36104 2012-06-16 01:30:01 +0900

version.h の日付更新。