ruby-trunk-changes r38975 - r38993

今日は Range#bsearch、Array#bsearch の不具合/仕様の修正や Vector#inner_product の複素数対応、mingw32 での fstat() の不具合修正などがありました。

akr:r38975 2013-01-29 21:41:56 +0900

Net::HTTP::GenericRequest の multipart form data の処理で生成した Tempfile を利用後に明示的に Tempfile#close(true) で削除するようにしています。

marcandre:r38976 2013-01-30 03:58:37 +0900

Module#attr_reader の rdoc 用コメントで引数名が signature と説明文で一貫性が取れていなかったのを修正。 [ruby-core:51737] [Bug #7753]

svn:r38977 2013-01-30 03:58:41 +0900

version.h の日付更新。

marcandre:r38978 2013-01-30 07:00:36 +0900

Range#bsearch による探索が Range の start end の値が Float の場合に浮動小数点数の精度を意識した内容になっていなくて不要な yield を繰り返していたり、範囲外の数値を yield していたので(こちらの理由はよくわかりませんが)、double を int64_t (64bit 整数)にマッピングして二分探索するようにしています。 double の表現は IEEE 754 では(他の表現方法だとどうなんでしょう?) 符号ビット+指数ビット+仮数ビット となっているので、符号ビットを除くとあとは大小関係だけは整数として判定しても同じなのでこれでいいんだそうです。 また中間値を取る時にオーバフローを考慮するようにしています。 [ruby-core:51563] [Bug #7724]

marcandre:r38979 2013-01-30 07:00:58 +0900

型の変換に to_str や to_ary, to_hash などの「暗黙的な変換」を行うメソッドがなくて失敗した時と、to_s や to_a による変換が失敗した時とで TypeError 例外のメッセージを分け、暗黙的変換の時は "no implicit conversion of X into Y" のようなメッセージにしています。 変換メソッドを明示してはどうかという提案に対しては drbrain さんが to_str や to_ary はそのオブジェクトが String, Array と同様に振る舞うという前提がありあまりほいほい定義していいものではないけど、メッセージに出すとユーザがそれを定義して回避してしまうことになるんじゃないかと書いていてなるほどと思いました。 [ruby-core:50733] [Bug #7539]

marcandre:r38980 2013-01-30 07:15:23 +0900

正規表現のマッチの引数を String に変換するところで rb_check_string_type() を利用して例外の発生をまかせるようにしています。 [ruby-core:50733] [Bug #7539]
ちなみに rb_convert_type() は変換しようとして失敗したら(メソッドが未定義だったら)例外が発生して、rb_check_convert_type() は Qnil を返すというのは、名前の印象と逆のような気がしますね。いや、チェックしてから呼ぶぞ、みたいなニュアンスなのか。ううむ。

nobu:r38981 2013-01-30 13:17:59 +0900

$~ や $_ などの thread local な特殊変数(svar)が Fiber 間での動作が不安定だったのを、Fiber 間で独立して保持するように変更しています。 [ruby-core:51331] [Bug #7678]

nobu:r38982 2013-01-30 13:22:12 +0900

トップレベルのローカル変数は代入しただけで参照されていない場合に -w フラグが指定されていても警告が出力されていなかったのを、メソッド内のローカル変数と同様に警告の対象としています。 ただし -e オプションで渡されたスクリプトの場合は警告対象としないようにしているようです。 +0 のところが tricky ですが ifndef_ripper() は ripper から利用される時は空になるので、その時は単項演算子の "+" として "+0" で偽になるようにしているのだと思います。 [ruby-core:51580] [Feature #7730]

marcandre:r38983 2013-01-30 13:53:58 +0900

標準添付ライブラリ matrix.rb の Vector#inner_product が要素が Complex の時に負の値になり得るので、共役数を掛け合わせるエルミート内積として動作するようにしています。 [ruby-dev:46101] [Bug #6967]
これで知ったのですが、Numeric#conjugate って常に定義されているんですね。 Complex が組み込みだから当然といえば当然か。

marcandre:r38984 2013-01-30 14:11:03 +0900

Range#bsearch および Array#bsearch がブロックの省略時に Enumerator を返すようにしています。 [ruby-core:51564] [Bug #7725]

marcandre:r38985 2013-01-30 14:46:48 +0900

Range#bsearch の start と end が Rational や BigDecimal などの精度の制限のない数値を表すクラスの場合に際限なく yield を繰り返し続ける場合があるので Float と Integer 以外の数値は許容しないようにしています。具体的には integer? メソッドを呼んで判定しています。 [ruby-core:51573] [Bug #7728]

marcandre:r38986 2013-01-30 15:00:24 +0900

Array#bsearch と Range#bsearch でブロックから返された値が true, false, nil もしくは整数以外だった時になんとなく真偽値として変換して使うようにしていたのを TypeError が発生するようにしています。 [ruby-core:51565] [Bug #7726]

marcandre:r38987 2013-01-30 15:01:40 +0900

r38986 で生成する例外のメッセージの空白の入れ忘れを修正しています。 [ruby-core:51565] [Bug #7726]

marcandre:r38988 2013-01-30 15:07:29 +0900

さらに r38986 で生成する例外のメッセージに余分な単語が入っていたのを除去しています。 [ruby-core:51565] [Bug #7726]

nobu:r38989 2013-01-30 15:20:26 +0900

r38983 の ChangeLog のインデントの修正と、r38978 および r38985 あたりで追加した range.c の部分のコーディングスタイルを修正しています。

nobu:r38990 2013-01-30 15:21:33 +0900

Mac OS X では SEGV などした時のバックトレース等の情報は ~/Library/Logs/CrashReporter などのディレクトリの下にログファイルとして出力されるので、rb_bug() ではバックトレースを出力するかわりにこれらのディレクトリの下にあるファイルも参照するようにというメッセージを出力しているのですが、その位置は最初のほうにもっていっています。

shugo:r38991 2013-01-30 15:30:12 +0900

UNIXSocket の connect(2) で失敗した時の SystemCallError 例外発生時に UNIXSocket のアドレス(パス)の文字列に NUL 文字('\0')を含めることができることを考慮して rb_inspect() で文字列化してから渡すようにしています。

nobu:r38992 2013-01-30 17:08:23 +0900

r37337 で(理由ははっきりしませんが) mingw32 の環境で fstat() のために _fstati64() を利用するようにしたのですが、これにより File.utime のテストが失敗しているということで、r37337 を revert しています。 [ruby-core:51729] [Bug #7276]

akr:r38993 2013-01-30 21:01:51 +0900

getsockname(2) や getpeername(2), accept(2) などが返す第3引数 len に格納したサイズが元々用意していた buf の構造体のサイズを越えていた時に、元のサイズを越えないように丸めてから Addrinfo の作成関数に渡すように修正しています。 これらのシステムコールが渡した len を越える値を返すことってあるんですね。そういえば len が小さすぎるというエラーが man に記述されてなくって、どうなるんだろと思ったことがあったような気がします。