ruby-trunk-changes r33805 - r33817

今日は Float#step の修正、Bignum#/ の挙動が変化していたのを修正、Windows 版の dup(2) のエミュレートの不具合修正などいろいろありました。

akr:r33805 2011-11-21 23:40:09 +0900

Linux で procfs が mount されていたら /proc/self/status から FDSize というエントリが読めるので、そこから最大の fd のヒントを読み込む linux_get_maxfd() という関数を追加して、rb_close_before_exec() で利用するようにしています。

akr:r33806 2011-11-22 00:26:12 +0900

r33805 で追加した linux_get_maxfd() のコンパイラ警告除去。

svn:r33807 2011-11-22 00:26:16 +0900

version.h の日付更新。

akr:r33808 2011-11-22 00:46:14 +0900

fcntl(F_DUPFD) のテストで F_DUPFD で指定するのは fd の下限値であってその値そのものに必ず dup されるわけではないので assertion を変更しています。

tenderlove:r33809 2011-11-22 04:47:09 +0900

psych から autoload の利用を削除して事前に require するようにしています。標準ライブラリで autoload を使わないようにしようという話があるのでその一環だと思います。

akr:r33810 2011-11-22 07:00:50 +0900

Fcntl::F_DUPFD が未定義の時にテストをスキップするようにしていましたが、現在サポートしているプラットフォームで F_DUPFD は常に利用可能なので(Windows もエミュレートしているコードが win32 にある)、スキップをやめています。 [ruby-dev:44874]

naruse:r33811 2011-11-22 10:47:35 +0900

Float を境界値として持つ Range の step の終端の扱いの修正。誤差の計算方法の変更や、終端を含む時に誤差のため計算結果が終端よりも大きくなってしまった時はかわりに終端の値を使うようにするなどの修正が含まれています。 [ruby-core:35753] [Bug #4576] [ruby-core:39608] [ruby-core:39612]

naruse:r33812 2011-11-22 11:27:53 +0900

r33536 で Bignum#div に 0.0 を渡した時に FloatDomainError ではなく ZeroDivisionError を発生させるように修正したのですが、Bignum#/ で除算した時には 0.0 で割ると例外発生ではなく Float::Infinity を返すのに、そっちまで ZeroDivisionError が発生するようになっていたので修正しています。 [ruby-core:40429] [Bug #5490]
div と '/' で微妙に動作が異なるんですね。

nobu:r33813 2011-11-22 11:34:00 +0900

win32/win32.c の dupfd() で _osfhnd() という関数マクロの引数に副作用のある式が書かれていたので、その部分を外に出すようにしています。マクロの引数は複数回評価されるように展開されてしまうかもしれないので、っていうことですね。

naruse:r33814 2011-11-22 13:54:42 +0900

r33811 で Float#step のステップが負の値だった場合に終点との比較の符号を反転するようにしています。
ここの ChangeLog のエントリが空になってますね。

naruse:r33815 2011-11-22 14:38:55 +0900

minitest の assert_raises の例外の詳細情報を文字列化する処理を実際にエラー(つまり期待したものでない例外が発生した場合だけ)実行するように Proc オブジェクトに包んで渡すようにしています。 これを読んではじめて知ったのですが assert は message の引数に Proc オブジェクトが渡されてたら Proc#call を呼んでくれるようになっているので、メッセージの生成を遅延できるんですね。

nobu:r33816 2011-11-22 17:49:47 +0900

win32/win32.c の _pioinfo() というマクロを inline 関数化しています。なるほど、元は _pioinfo() がマクロで引数が複数回評価されていたので r33813 で修正した _osfhnd() の引数に副作用のある式があるのは実際に問題になっていたのですね。

usa:r33817 2011-11-22 18:08:34 +0900

r33816 で inline 関数化した _pioinfo() の宣言を _pioinfo の呼び出しに展開される _osfhnd などのマクロの定義の前に追加しています。マクロの宣言にもその中で利用される関数の宣言が必要なんですね。なんとなくマクロの利用箇所で宣言済みなら大丈夫なような気がしましたが、たぶん gcc がたまたまそう動作してくれるというだけなのでしょう。 じゃなくて、直後の set_pioinfo_extra() で _osfhnd() を呼んでいるからでした。