ruby-trunk-changes r38425 - r38449

今日は VM_METHOD_TYPE_CFUNC_FRAMELESS という VM の最適化のためのメソッド種別を削除したり、TracePoint#defined_class の仕様を変更したり、openssl の脆弱性対策を有効にする変更をしたりといったコミットがありました。

zzak:r38425 2012-12-18 02:36:56 +0900

Matrix#lup の rdoc 用コメントの間違い修正。 [ruby-core:50946] [Bug #7582]

svn:r38426 2012-12-18 02:37:02 +0900

version.h の日付更新。

zzak:r38427 2012-12-18 02:37:28 +0900

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

zzak:r38428 2012-12-18 02:44:34 +0900

lib/optparse.rb に " Developer Documentation (not for RDoc output)" と評されたコメントがあるのでこれを rdoc で解釈しないようにコメントアウトしています。 "#--" の行でコメントアウト開始、"#++" の行で戻すということができるんですねぇ。 [ruby-core:50526] [Bug #7504]

tenderlove:r38429 2012-12-18 03:04:50 +0900

拡張ライブラリ psych のパーサの一部 Psych::Visitors::ToRuby#visit_Psych_Nodes_Mapping で大きな case 文で、頻出するもの(よくマッチするもの)を前のほうに移動させることでパフォーマンスを改善させようとしています。

ko1:r38430 2012-12-18 05:28:51 +0900

TracePoint の call イベント等での TracePoint#defined_class でそのメソッドの定義されているクラス/モジュールを返すのですが、特異クラスが定義されている時にはそのオブジェクト自体が渡されていたので、メソッドが定義されている特異クラス*1を返すように変更されています。 set_trace_func はブロックパラメータ6番目に類似のパラメータを渡すのですが、これは特異クラスではなくてその元のクラスを渡すそうなのでこの点は TracePoint と set_trace_func で挙動が異なっていて、移植する時に注意が必要とのことです。 [ruby-core:50864] [Bug #7554]

ko1:r38431 2012-12-18 07:04:12 +0900

r37198 で VM_METHOD_TYPE_CFUNC_FAST として追加されその後 r37252 で VM_METHOD_TYPE_CFUNC_FRAMELESS と改名されたメソッド種別を削除しています。これは C で実装されたメソッドで VM のスタックフレームを利用しないでいいメソッドを呼ぶためにフレームを積まずに呼ぶようにしたもの*2でした。これは特化命令のようによくつかわれるメソッドを高速に処理できるようにしようという目的で導入したのですが、メソッド内から別のメソッドを呼ぶ必要がある場合がある(オブジェクトの型の変換など)ことが大くて実際に使える場面が限定されていて、そういうフレームを積む必要があるケースと不要な(そしておそらくそちらが頻度が高い)ケースがうまく分離できるようにしたほうがいいということで、一旦削除されています。
コミットメッセージに非常に詳しく動機や今後の目論見など書かれているので興味のある方は読むといいと思います。

ko1:r38432 2012-12-18 07:08:00 +0900

r38431 の ChangeLogtypo を修正しています。

emboss:r38433 2012-12-18 11:02:43 +0900

OpenSSL::SSL::SSLContext#options のデフォルト値を OpenSSL::SSL::OP_ALL & ~OpenSSL::SSL::OP_DONT_INSERT_EMPTY_FRAGMENTS に変更しています。 これは insertion of empty fragments を可能にして暗号化の攻撃に対処できるようにしているみたいです。詳しくはチケットやそこから参照されているリンク先へ! CBCモード(ブロック暗号でブロック間を混ぜ合わせる方法のひとつ)に対する攻撃の対処が入っているのですが、これがデフォルトのオプションだと有効にならないので対象のビットフラグを落とすようにしています。一部の SSL/TLS 実装はこの対処をしたプロトコルをうまく扱えないからデフォルトで有効にしていないということですが、Ruby の openssl はデフォルトで有効になります(2.0 から?)。 [ruby-core:39673] [Bug #5353]

emboss:r38434 2012-12-18 11:04:52 +0900

openssl のテストのコメントの英文を修正しています。

naruse:r38435 2012-12-18 11:06:39 +0900

test/ruby/test_require.rb で一部の require が失敗するはずのテストでロードできてしまった時に $LOAD_PATH と環境変数 RUBYLIB を表示するようにしています。
これはわたしの手元でこのテストが失敗していたので表示するようにしていただいたのですが、単にビルドディレクトリに foo.rb というファイルが存在していて、このテストが require "foo" していたというオチでした。

emboss:r38436 2012-12-18 11:32:28 +0900

拡張ライブラリ openssl の OpenSSL::SSL::SSLContext#ssl_version のテストで明示的に ctx.ssl_version = :TLSv1_2_client しておくようにしています。 OpenSSL のバグの回避とのことですが、バグというよりこれもサーバ側が対応していない場合に新しいバージョンで接続しにいくことができないので使うなら明示的な指定が必要みたいな感じですね。チケットをざっと読んだだけなので勘違いかもしれませんけど。 [ruby-dev:46240] [Bug #7197]
[追記]shugo さんから教えていただきましたが、やはりサーバ側がうまく対応していないことがあるので Ubuntu などではデフォルトで TLS v1.2 が有効にならないようになっているためとのことでした。[/追記]

drbrain:r38437 2012-12-18 11:48:35 +0900

doc/syntax/literals.rdoc の 8進数表記に 0o および 0O (ゼロ+アルファベットのオー)を接頭語とした表記について追記しています。そういえばそんな仕様もあったような気も……。

drbrain:r38438 2012-12-18 12:16:27 +0900

RubyGems の修正で gem の requirements に複数のバージョンが指定されていた時の対応。また RubyGems の cmake によるビルドのテストでメッセージのチェックが厳密すぎて環境によって失敗していたのをゆるやかにマッチさせるように修正しています。 [ruby-core:50928] [Bug #7579]

zzak:r38439 2012-12-18 13:16:00 +0900

r38430 と r38431 の ChangeLog エントリの typo 修正。

zzak:r38440 2012-12-18 13:18:06 +0900

TracePoint#defined_class の rdoc 用コメントの体裁など修正。

nagachika:r38441 2012-12-18 13:30:44 +0900

Fiber 内で rb_fatal() などによる rescue で捕捉できない致命的な例外の発生をさせた時に、通常であればプロセスが異常終了するのに Fiber が終了するだけで無視されて続きが実行できてしまう不具合を修正しています。 r38414 と似ていて、不正な制御文によるジャンプをエラーにしている rb_vm_make_jump_tag_but_local_jump() で TAG_FATAL によるジャンプも考慮するようにしています。 [ruby-core:50917] [Bug #7570]

nobu:r38442 2012-12-18 13:31:13 +0900

r38441 で新規追加したファイルの svn property 設定。

drbrain:r38443 2012-12-18 16:31:36 +0900

rdoc のパーサのヒアドキュメントの解釈をするように機能追加しています。 RDoc はざっくりしたやりかたでスクリプトやCソースをパースしていますね。

drbrain:r38444 2012-12-18 16:39:15 +0900

詳細はわかりませんが RDoc::Store#store で古い RDoc のバージョンのキャッシュが残っててエラーになるのを回避しているようです。

drbrain:r38445 2012-12-18 16:46:33 +0900

doc/syntax/literals.rdoc のヒアドキュメントの説明に本質的には無関係なメソッド定義を含んでいたのを削除しているのと、ヒアドキュメントのトークンをバックスラッシュでクオートした場合の動作について追記しています。

drbrain:r38446 2012-12-18 17:24:57 +0900

RDoc の修正で rdoc がパースするファイルに #! が含まれていた時のケアみたいで、これを消さないようにすると書いてあるのですが、そもそも rdoc は対象のソースファイルを変更したりしないんじゃないかと思うので、どこから消さないようにするという意味なのかよくわからないなぁと思って差分をみてもよくわからなかったです。処理中の文字列から消さないという意味なのかなぁ。

kosaki:r38447 2012-12-18 19:07:05 +0900

rb_thread_wait_fd_rw() で rb_wait_for_single_fd() が正の数を返すまでループしているところがあったのですが、rb_wait_for_single_fd() は正の数を返さないので無限ループしてたのを修正しています。なんということでしょう。

kosaki:r38448 2012-12-18 19:07:15 +0900

r38397 で rb_io_wait_writable() で rb_thread_wait_fd() を呼ぶようにしたのを削除しています。 そして errno==EAGAINの時は rb_thread_fd_writable() を呼んで読み込み可能になるのを待つようにしています。 rb_io_wait_readable() でも同様に rb_thread_wait_fd() は削除、rb_wait_for_single_fd() を直接使うかわりに rb_thread_wait_fd() を使うように修正しています。 rb_thread_wait_fd()/rb_thread_fd_writable() を経由したほうが rb_wait_for_single_fd() の返り値をちゃんとチェックしていたり fd の close 済みチェックをしていたりします。

nagachika:r38449 2012-12-18 23:02:18 +0900

r38441 の ChangeLog エントリに ML とチケットの参照を追記しています。

*1:特異メソッドはそのオブジェクトに固有のメソッドですが、メソッドはクラス/モジュールにしか属さないので、そのオブジェクト専用の特異クラスを作ってそこにメソッド定義が置かれます。まあほかにも IClass もありますけど

*2:実際には遅延されててもし必要になったら積まれるんだった気が……と思ったらそれは r37293 の OPT_CALL_CFUNC_WITHOUT_FRAME で有効になる最適化でした