ruby-trunk-changes r32705 - r32725

今日は主に DL の GC もれの修正と、OpenSSL::Cipher の SEGV 修正がありました。

nagachika:r32705 2011-07-27 22:49:43 +0900

Rinda のテストで DRbObject.new に Array や Hash のリテラルをそのまま渡していたために GC されてしまう可能性があった(DRbObject は object_id などだけ保持して直接オブジェクトを参照しない可能性があるので Ruby スクリプトのレベルで GC からの保護が必要)のでローカル変数に一旦代入するようにしています。 [ruby-dev:44253] [Bug #5104]

nobu:r32706 2011-07-27 23:55:40 +0900

r32695 で ruby-mode.el のための workaround として %w{ } の中にバックスラッシュを入れてしまってテストに失敗していたのでリテラルの記法を %W{ } に変更しています。なるほどー %W{ } ならエスケープが有効になるんですね。

naruse:r32707 2011-07-28 00:30:11 +0900

FileUtils のテストのファイル権限の仕様と SIGCHLD のシグナルハンドラと wait(2) の関係について FreeBSD では除外していたテストが OpenBSD でも同様の問題があったことが確認できていたので skip 条件に追加しています。 [ruby-core:38530]

svn:r32708 2011-07-28 00:30:15 +0900

version.h の日付更新。

nobu:r32710 2011-07-28 00:52:23 +0900

不要なシンボル生成の抑制についてのテストで const_missing フックメソッドを NameError 例外を定義するようにしています。また const_missing が定義されていると const_get ではシンボルが生成されてしまうので、const_get のぶんの assertion はコメントアウトしています。

nobu:r32711 2011-07-28 01:18:54 +0900

同じく method 系のメソッドのテストで respond_to_missing? を定義するようにしています。respond_to_missing? を定義すると respoond_to? ではシンボルが作成されてしまうので respond_to? についての assertion はコメントアウトしています。

nobu:r32712 2011-07-28 02:15:09 +0900

DL::CFunc と DL::CPtr でアドレスを指定するために渡すオブジェクトが整数でなかったら Integer に変換する前のオブジェクトを保存して mark して GC から保護するように mark 関数を追加しています。 [Bug #4929] に関連しての修正ですがこの他にもどこか GC もれがあるようです。
DL::CPtr のほうは freefunc を保護しないといけないというのはわかるのですが、DL::CFunc のほうは整数に変換してポインタを持った後は元の引数のオブジェクトは保持していないので、こっちは不要なんじゃないかなぁと思うのですがどうなんでしょう。

drbrain:r32713 2011-07-28 04:53:44 +0900

lib/delegate.rb の rdoc 用コメントの位置を移動しています。

naruse:r32715 2011-07-28 09:23:28 +0900

昨日の r32702 での __syscall がヘッダで宣言されていない時のための対処ですが __syscall がマクロとは限らないということで defined(__APPLE__) で判定するように変更しています。

seki:r32717 2011-07-28 12:25:55 +0900

Rinda のテストでタイミング依存やシステムの負荷によって失敗する可能性のあったテストを修正しています。 [Bug #372] [Bug #4160]

nobu:r32718 2011-07-28 12:32:45 +0900

r32712 で DL::CPtr で元のアドレスを保存する条件(整数への変換で別のオブジェクトになったか)が反転していた部分を修正しています。

nobu:r32719 2011-07-28 12:32:48 +0900

同じく DL::CPtr で rb_respond_to() + rb_funcall() でメソッドの有無を調べて呼んでいるところを rb_check_funcall() という類似のことをする関数の呼び出しに置き換えています。

nobu:r32720 2011-07-28 12:32:52 +0900

DL::CPtr#[] で不正なアドレスを指すポインタを dereference しようとしたら SIGSEGV や SIGBUS が発生していましたが、一応 NULL ポインタだけは事前にチェックして DL::DLError の例外発生にするようにしています。

nobu:r32721 2011-07-28 12:32:56 +0900

拡張ライブラリ dl でコールバック関数用の様々なインタフェースに対応したスタブ関数を生成するための ruby スクリプトが生成するコードで PTR2NUM() マクロを利用してコードをシンプルにしています。

usa:r32722 2011-07-28 14:26:20 +0900

RubyGems の Gem::StreamUI#tty? で RUBY_VERSION の条件判定は反転していたのを修正。

nahi:r32723 2011-07-28 22:48:05 +0900

OpenSSL::Cipher::AES128 などを鍵の設定を呼ばずに update メソッドを呼ぶと SEGV する可能性があったので、あらかじめ 0 埋めした鍵で初期化しておくようにしています(通常の使い方ではまず鍵の設定をしてから update を呼んで暗号化したいデータを渡します)。 [ruby-core:28269] [Bug #2768]

nagachika:r32725 2011-07-28 23:47:51 +0900

DL::Function.new にブロックを渡して作ったコールバック関数の call メソッドでブロックを呼び出す時に引数が GC される危険があったのを修正しています。xmalloc() でヒープから確保した C の配列にブロックに渡す引数を順に生成して格納していましたが、GC で mark されるように rb_ary_tmp_new() でバッファ用の Array オブジェクトを作ってそこに格納するようにしています。 [ruby-core:38546] [Bug #4929]