ruby-trunk-changes r32987 - r32996

今日は Rational#coerce の修正(Complex と Rational の演算)、BigDecimalGC 保護もれの修正などがありました。

emboss:r32987 2011-08-17 04:59:38 +0900

openssl の rdoc 用コメントの修正。 OpenSSL::PKey::DH の署名/検証は未サポート。

svn:r32988 2011-08-17 04:59:42 +0900

version.h の日付更新。

emboss:r32991 2011-08-17 06:37:46 +0900

openssl の OpenSSL::X509::Certificate の rdoc を追記しています。
C ソースのコメントで rdoc にネストしたクラス/モジュールを認識させるために上のモジュールの rb_define_module(_under) をわざわざ #if 0 でコメントアウトした中で書いているので、複数ファイルにソースコードを分割している拡張ライブラリではクラス/モジュールの定義は一箇所にまとめるほうが楽そうですね。

emboss:r32992 2011-08-17 06:41:25 +0900

r32992 で追記した rdoc 用コメントの末尾の空白を削っているだけです。

mrkn:r32994 2011-08-17 10:24:22 +0900

Rational#coerce の引数に Complex が渡された場合に、虚数部が 0 でなかったら self を Complex に変換したものを返すようにしています。 Numeric#coerce は + とか - 等の数値の演算子でレシーバが引数のオブジェクトのクラスの扱いを知らない時に引数側に self を渡して呼ばれるので、両者を演算可能なオブジェクトに変換するものです。 [ruby-dev:44088] [Bug #5020]

mrkn:r32996 2011-08-17 15:35:21 +0900

BigDecimal の coerce のエラー時の処理で例外メッセージのために rb_inspect() で生成した String オブジェクトをそのまま RSTRING_PTR() で C の文字列を取り出して利用していて、コンパイラの最適化によっては GC から保護されないようになっていたので、String オブジェクトの操作で例外メッセージを生成して rb_exc_raise() を呼ぶように修正しています。 [ruby-core:38862] [Bug #5172]
rb_special_const_p() が真の時の rb_inspect() は常に新しい String だと思うので rb_str_dup() はしなくても大丈夫じゃないかな、とも思いますが将来に渡って安全のためにはいいのかもしれません、例外発生時だけですしそんなにパフォーマンスを気にしてもしかたないですし。
[追記] to_s を再定義してしまって同じ String オブジェクトを返すようにすると dup する必要があるということでした。なるほど……[/追記]