ruby-trunk-changes r39877 - r39889

今日は respond_to? が再定義されていた時の Array#zip の不具合修正や SEGV 時のバックトレース出力でさらに SEGV する不具合の修正などがありました。

marcandre:r39877 2013-03-23 07:30:45 +0900

Object#respond_to? を再定義すると、挙動は変えていなくても Array#zip が引数に渡された Enumerable の値を取り出さなくなる不具合を修正しています。 take_items() で rb_check_block_call() を使っていたのを rb_block_call() に変更しています。 またカウンタを NODE を使って渡すようにしています。 take_i() で カウンタのデクリメントのタイミングが変化しているのがちょっと気になりますけど、この変更はこの不具合修正に対して必要なんでしょうか。 [ruby-core:53650] [Bug #8153]

svn:r39878 2013-03-23 07:30:51 +0900

version.h の日付更新。

marcandre:r39879 2013-03-23 07:56:13 +0900

Array#zip のテストで例外のチェック(assert_raise)で発生しない例外も含まれていたのを削っています。

marcandre:r39880 2013-03-23 08:01:10 +0900

r39879 と同様に Enumerable#zip のテストでも assert_raise の発生する例外として NoMethodError が含まれていたのを削っています。

nobu:r39881 2013-03-23 17:39:55 +0900

r39877 の Array#zip の変更は rb_check_block_call() に不具合があったので使わないようにしていましたが、これは revert して check_funcall_respond_to() で passed_block を保存しておいて respond_to? のメソッド呼び出し後に復旧するようにして rb_check_block_call() の不具合自体を修正しています。 [ruby-core:53650] [Bug #8153] [ruby-core:53653] [Bug #8154]

nobu:r39882 2013-03-23 17:45:32 +0900

Array#zip の実装で使われている take_items() の中で発生させている例外メッセージでクラス名を埋め込んでいるところを C の文字列にして渡さずにオブジェクトそのままで渡すようにしています。 クラス名のエンコーディングを考慮するため。

nobu:r39883 2013-03-23 17:46:10 +0900

メソッドを再定義してそれを Method オブジェクトとして取り出して Method#call で呼ぶというのを繰り返していると SEGV するという不具合を KNOWNBUGS.rb に登録しています。バックトレースをみると method entry の検索で SEGV しているので GC 保護漏れとか生きているオブジェクトの m_tbl を弄ってしまって壊れているとかって不具合っぽいですね。 [ruby-core:53439] [Bug #8100]

naruse:r39884 2013-03-23 23:21:22 +0900

openssl のテストで OpenSSL::X509::StoreContext#cleanup を呼ぶと警告が発生するので警告抑制用のユーティリティ EnvUtil.suppress_warning のブロックで呼ぶようにしています。

mrkn:r39885 2013-03-23 23:30:56 +0900

拡張ライブラリ bigdecimal で引数が BigDecimal に変換されて処理できた時の目印の戻り値として (VALUE)0 (Qfalse) を使っていたのを Qnil を返すようにリファクタリングしています。

naruse:r39886 2013-03-24 01:05:47 +0900

tool/mkconfing.rb の未使用変数を削除しています。

naruse:r39887 2013-03-24 01:05:51 +0900

addr2line.c でバックトレース情報を表示する時に fprintf(3) は async-signal-safe でないためさらに SEGV してしまう不具合を修正するため、kprintf() を利用するようにしています。 kprintf() の実装を FreeBSD からもらってきています。 [ruby-core:53632] [Bug #8144]

svn:r39888 2013-03-24 01:05:52 +0900

version.h の日付更新。

akr:r39889 2013-03-24 02:16:21 +0900

mkmf.rb のテストで Tempfile を使っているところで後始末として明示的に一時ファイルを削除するようにしています。