ruby-trunk-changes r43679 - r43686

今日は引き続き callcc による不具合の修正や最近追加された ObjectSpace.dump_all や Exception#cause などの機能の仕様追加、不具合修正などがありました。

nobu:r43679 2013-11-15 01:06:09 +0900

r43585 で追加された ObjectSpace.dump_all のインタフェースを修正しています。 :file オプションに IO オブジェクトを直接渡すこともできるようにしています。 またファイルの指定がない時に一時ファイルを作成するのに mkstemp(3) を使っていたのを標準添付ライブラリ tempfile の機能を使って作成するようにしています。 mkstemp(3) で作ると fd に close-on-exec フラグがつかないので fd leak のおそれがあるため、これを利用しないようにしています。 [ruby-core:58266] [Bug #9102]

svn:r43680 2013-11-15 01:06:14 +0900

version.h の日付更新。

nobu:r43681 2013-11-15 17:07:35 +0900

iseq.c で RubyVM の命令列へコンパイルする時のオプション指定をまとめた構造体 rb_compile_option_t の内容を初期化するのにバイト単位で 1 を埋めていたのですが、この構造体は int 型のメンバが並んだものなので int 単位で 1 埋めするように変更しています。オプションが真偽値だとすればどっちも真ではありますが一応、って感じでしょうか。

nobu:r43682 2013-11-15 17:07:39 +0900

標準添付ライブラリ delegate.rb で Delegator#send を method_missing の alias として定義しなおしています。 send でメソッドを呼ぼうとすると delegate 先のオブジェクトのメソッドではなくて Delegator 自身のメソッドを呼ぼうとしてしまうため、とのことなのですが、 send メソッド自体が再定義されたものの場合はそれを呼ぶべきなんじゃないでしょうか。

class A
  def send
    "A#send"
  end
end
a = SimpleDelegator.new(A.new)
a.send # => ArgumentError: no method name given
       # => "A#send" を呼んで欲しいのでは?

nobu:r43683 2013-11-15 22:21:38 +0900

昨日の r43675 での Hash#each のブロック内に callcc で再入した時の RHASH_ITER_LEV() の値がおかしくなる不具合の再修正です。 カウンタを保存しておいて後で戻すのはマルチスレッド時に問題があったので T_DATA 型のオブジェクトを生成しておいて、その DATA_PTR() の値をチェックして hash_foreach_ensure() の処理を最初の1回だけ実行するようにしているみたいです。 [ruby-dev:47807] [Bug #9105]

nobu:r43684 2013-11-15 23:08:49 +0900

r43636 で追加された Exception#cause を保存する機能の修正で、Exception#cause をセットするのを例外を作る時ではなくて raise する時にまで遅延させるようにしています。 ある例外を捕捉した rescue 節内でその例外を raise した時に cause が自分自身を指すようになってしまっていたようです。 [ruby-core:54185] [Feature #8257]

glass:r43685 2013-11-16 00:29:23 +0900

やはり callcc で at_exit のブロック内の継続を、その後に実行される at_exit のブロック内で呼び出して戻ると free(3) 済みの領域を再度 free() してしまってエラーになっていたのを修正しています。 at_exit で登録する終了時の処理を実行してすぐに解放していたのを最後にまとめて解放するようにしています。
いやーしかしこれは他にもいろいろ同じような問題があって大変そうですね。 Fiber があれば callcc はもういらないんじゃ…。 [ruby-core:58329] [Bug #9110]

svn:r43686 2013-11-16 00:29:28 +0900

version.h の日付更新。