ruby-trunk-changes r35765 - r35771

今日は raise で発生する Exception の backtrace の内部表現を変更して効率的に例外発生できるようにする変更がコミットされています。Marhsal で互換性がなくなっているそうなので文句がある人は早めに言ってくださいとのことなので要チェックです。

drbrain:r35765 2012-05-24 05:04:39 +0900

テスト用の拡張ライブラリの extconf.rb が生成するファイルを svn:ignore に追加しています。

nobu:r35766 2012-05-24 12:07:49 +0900

open のモードに 'bom' の指定があって先頭 3バイトまで読み込んで判定しているところで、ファイルが2バイト以下しかなくて EOF が返ってくると rb_io_getbyte() が Qnil を返すのにそれを判定していなかったので例外が発生していた不具合を修正しています。 [ruby-core:45203] [Bug #6487]

svn:r35767 2012-05-24 12:07:54 +0900

version.h の日付更新。

naruse:r35768 2012-05-24 13:05:09 +0900

ChangeLog のファイル名の typo 修正です。

ko1:r35769 2012-05-24 15:09:23 +0900

例外発生時に Exception にセットする backtrace の情報を効率的に生成するように内部的な RubyVM::Backtrace というクラスを導入しています。Exception#backtrace メソッドが呼ばれた時にはその場で従来の文字列の配列というオブジェクトに変換して返すようにしているため表には見えないようになっているようですが*1、Marshal.dump した時にはそのままダンプされているようです。なお、この影響で、dRuby でこの変更が入る前の ruby からと新しい ruby のメソッドを呼んで、そこで例外が発生すると、

DRb::DRbUnknownError: RubyVM::Backtrace

のような別の例外が発生してしまいます。例外の情報に今回追加した RubyVM::Backtrace のオブジェクトが含まれるため、そのクラスが見付からなくて本来の例外が読み込めないためです。
あと rb_backtrace_p() などのオブジェクトの型をチェックしている関数は rb_check_typeddata() みたいに汎用的なのがあったほうがいいかもしれませんね。rb_check_typeddata() は例外を発生させるので真偽値を返す関数が。
rb_typeddata_is_kind_of() という関数があるのでこれを使うのがよさそうですね。

ko1:r35770 2012-05-24 15:36:44 +0900

r35769 でメソッドの定義の実態がある C の関数かどうかをチェックする関数 rb_method_defined_by() を追加していたのですが、これは rb_method_basic_definition_p() を使って継承されていないかをチェックすればいいということで削除しています。

nobu:r35771 2012-05-24 18:51:20 +0900

vm.c の backtrace 変更で追加されたコードでスタックフレームのサイズを計算しているところで 64bitから 32bitに暗黙に変換されていて警告が出ていたところを明示的なキャストを入れてコンパイラ警告を抑制しています。

*1:セットしているインスタンス変数も "@" で始まらない変数名なので Ruby 上では見えない