ruby-trunk-changes r37261 - r37270

今日は C 実装のメソッドの呼びかたに変更がありました。 また throw-catch が require をまたがる時の不具合修正や String#unpack の結果のエンコーディングの修正などがありました。

ko1:r37261 2012-10-19 10:22:08 +0900

benchmark/driver.rb に --ruby-arg というオプションを追加して、ベンチマークを実行する時に ruby にオプションを渡せるようにしています。

svn:r37262 2012-10-19 10:22:12 +0900

version.h の日付更新。

ko1:r37263 2012-10-19 10:23:50 +0900

benchmark/ の下の不要なファイルを削除しています。

ko1:r37264 2012-10-19 10:24:50 +0900

vm_insnhelper.c の不要なローカル変数を削除しています。

ko1:r37265 2012-10-19 11:15:00 +0900

r37261 で benchmark/driver.rb に残っていたデバッグ用の ruby の実行コマンドラインの表示を削除しています。

ko1:r37267 2012-10-19 16:57:56 +0900

eval.c と vm_eval.c の PUSH_TAG()/POP_TAG() マクロを rb_thread_t の指定つきに TH_PUSH_TAG() を利用するように変更しています。 TH_ のつかないほうは GET_THREAD() の結果を渡していて、変更しているところでは th には GET_THREAD() した結果が入っているので動作には変更はないはずです。
rb_rescue2() には他にも PUSH_TAG()/EXEC_TAG()/POP_TAG() のトリオになっているところがありますが、ここも変更していいのでしょうか。

ko1:r37268 2012-10-19 19:38:30 +0900

C 実装のメソッドを呼び出すときのしくみを変更しています。 C の関数で実装されたメソッドを呼び出す時は引数の数に応じで呼び方を変更するために引数 0 から 15個までの VALUE 型の引数を渡す呼びかたと、可変長引数を配列で渡す(argc == -1, -2 の時)呼びかたをひとつの関数(call_cfunc())に用意しておいて、argc によって分岐していたのですが、この分岐やめるために、 argc によって対応する関数の呼びかたをするための関数 call_cfunc_xxx() という関数をそれぞれ用意しておいて、メソッド定義時に指定された引数に対応する関数を rb_method_cfunc_t::invoker という新しく追加したメンバに格納しておいて呼ぶようにしています。分岐は減らせたもののあまり早くはならなかったそうです。

eregon:r37269 2012-10-19 22:13:32 +0900

String#unpack の H, h, B, b で 16進数およびビットストリングに変換した結果の Encoding が ASCII-8BIT になっていたのを、結果には ASCII 文字しか含まれないはずなので US-ASCII にして返すようにしています。これにより unpack を利用していた SecureRandom.hex の結果も US-ASCII エンコーディングになるようになったようでテストが追加されています。 [ruby-core:47653] [Bug #7050] [ruby-core:46792] [Bug #6799]

nobu:r37270 2012-10-19 22:22:03 +0900

throw で大域脱出をするファイルを require して、その読み込み元で catch している時にそれを考慮せずに例外があるものとして実装していて NoMethodError になっていたのを修正しています。 [ruby-dev:46234] [Bug #7185]