ruby-trunk-changes r37285 - r37302

今日は psych の修正、YARV の新しい最適化オプションの追加、Thread.current.raise の挙動が変化してしまっていたのを修正する変更などがありました。

tenderlove:r37285 2012-10-23 06:02:16 +0900

ext/psych/lib/psych.rb のコメントの libyaml のリンクを更新しています。

svn:r37286 2012-10-23 06:02:20 +0900

version.h の日付更新。

tenderlove:r37287 2012-10-23 06:06:25 +0900

拡張ライブラリ pysch の文字列のパースでアンダースコアで始まる文字列を文字列として認識するように修正しているようです。更に変更が重なって差分だけでよく影響がわからなくなってますが。

tenderlove:r37288 2012-10-23 06:09:56 +0900

拡張ライブラリ psych で時刻っぽい文字列だけど実際に parse しようとしてみると範囲がおかしいなどで時刻としては不正な文字列を ArgumentError にするのではなく文字列として認識するようにしています。うーん、なるほど……。

tenderlove:r37289 2012-10-23 06:14:08 +0900

これもコミットログの意味がよくわからないのですが、拡張ライブラリ psych の Psych::Visitors::ToRuby#visit_Psych_Nodes_Sequence で tag が nil の時に case 文の else で処理していたのを明示的に when nil 節を用意して同じ処理をするようにしています。 method_missing が呼ばれると遅いから……と書かれているけどどういうことでしょう。
[追記]@znz さんに元になった GitHub の issue を教えていただきした。 https://github.com/tenderlove/psych/pull/88 つまり 正規表現の when 節のマッチで失敗するのが遅いから先にマッチさせてしまおうということみたいですね。[/追記]

tenderlove:r37290 2012-10-23 06:24:36 +0900

r37287 で 拡張ライブラリ psych の文字列のパースを修正した部分の再修正です。さらに記号から始まる文字列にも対応しています。

tenderlove:r37291 2012-10-23 06:24:50 +0900

Psych::ScalarScanner#tokenize で文字列を Symbol に変換した結果をキャッシュしておいて重複してシンボル化しなくてすむようにしています。

tenderlove:r37292 2012-10-23 06:25:02 +0900

拡張ライブラリ psych の Psych::SyntaxError が組み込みの SyntaxError を継承していたのを StandardError を継承した Psych::Error を継承するようにしています。 SyntaxError は StandardError を継承していないので対象を明示的に指定しない rescue で捕捉されなかったのですが、新しい定義では StandardError を継承した例外になるので捕捉されるようになります。

ko1:r37293 2012-10-23 13:22:31 +0900

OPT_CALL_CFUNC_WITHOUT_FRAME というマクロが非0に定義されている時に有効になる YARV の最適化が追加されています。デフォルトでは OFF になっています。
CFUNC のメソッドを呼ぶ時に frame を積まずに rb_call_info_t を rb_thread_t::passed_ci に保存しておいて、必要になったら後で vm_call_cfunc_push_frame() を呼んで保存しておいた rb_call_info_t の情報で frame をつくるようにしています。その「必要になったら」というのは GET_THREAD() マクロが呼ばれた時(に passed_ci に保存されていたら)自動的につくるようにしてあるのですが、なんで GET_THREAD() なんでしょう。メソッド呼び出しする時以外でも呼ばれることはあると思うのですが。[追記] フレームの情報が欲しい時は cfp を参照するはずで、その cfp は rb_thread_t に格納されているので、GET_THREAD() で current_thread を取得しようとした時にフレームを作るようにすればいいだろう、ということだそうです。 [/追記]
またこのために、r37268 で導入された rb_method_cfunc_t::invoker の関数に rb_call_info_t 経由ではなく引数に直接呼び出す関数ポインタを渡すようにしています。 CFUNC で frame 情報を省略できる時に cfunc->func を直接呼ぶようにしているためです。
あとついでに VM_PROFILE_UP/VM_PROFILE_AT_EXIT というマクロが追加されていて VM_PROFILE が非0に定義されている時はなにやら vm_profile_counter という配列にカウンタが格納されて、最後に atexit(3) で表示されるようになっています。

ko1:r37294 2012-10-23 13:33:04 +0900

Thread#raise を実行している Thread 自身に実行した時(つまり Thread.current.raise)に、Kernel#raise と同じようにすぐに例外発生することを期待する spec が rubyspec にあるそうで、それを通すために rb_threadptr_raise() の最後で RUBY_VM_CHECK_INTS() を呼ぶようにしています。がこれはすぐに revert されています。

ko1:r37295 2012-10-23 13:52:20 +0900

r37294 を revert しています。 make test が失敗してしまっていたそうです。

nobu:r37296 2012-10-23 14:06:50 +0900

GCC 4 より前のだと -fvisibility オプションが利用できないそうなので configure で GCC のバージョンをチェックして GCC 3以前の場合は -fvisibility オプションを使わないようにしています。

nobu:r37297 2012-10-23 14:20:45 +0900

最新の emacs で利用できるように misc/ruby-electric.el の obsolete になった変数を書き換えています。

nobu:r37298 2012-10-23 17:08:42 +0900

rubyコマンドラインオプションの -h/--help は伝統的に全てのオプションは表示されずだいたい一画面におさまる程度の行数をキープするようにされてきましたが、--help オプションの時には全てのオプションを表示するようにしています。 [ruby-core:48072] [Bug #7184]

ko1:r37299 2012-10-23 22:37:45 +0900

r37294 で追加され r37295 で revert された、Thread#raise が Kernel#raise と同じように振る舞うようにするための再修正です。Thread#raise を実装している関数の側で処理後に RUBY_VM_CHECK_INTS() で割り込みチェックするようにしています。

nagachika:r37300 2012-10-24 00:54:20 +0900

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

svn:r37301 2012-10-24 00:54:25 +0900

version.h の日付更新。

nobu:r37302 2012-10-24 01:37:47 +0900

r37298 で --help コマンドラインオプションの動作を変更したので、行数制限を確認しているテストを削除しています。 [ruby-core:48072] [Bug #7184]