ruby-trunk-changes r34765 - r34790

今日は Ruby の19歳の誕生日です。 Happy Birthday Ruby!
今日はドキュメントの修正の他 Psych の不具合修正や文字列リテラルのバックスラッシュの扱いの変更などがありました。

akr:r34765 2012-02-23 22:27:29 +0900

curses のテストスクリプトを追加しています。とりあえず Curses::VERSION のチェックしているだけ。

akr:r34766 2012-02-23 23:02:01 +0900

ext/dbm/extconf.rb で既にチェックしなくなったマクロの定義をコンパイラオプションに追加していたところを削除。

akr:r34767 2012-02-24 00:22:06 +0900

curses の定数 Curses::VERSION を定義しているところで想定されるプラットフォームについてコメントを追加しています。

svn:r34768 2012-02-24 00:22:10 +0900

version.h の日付更新。

drbrain:r34769 2012-02-24 07:23:58 +0900

Object#hash の rdoc に hash の利用されかたについての記述を少し詳しくして、さらにプロセスが異なると(起動する毎に)同じオブジェクトでも hash の値は異なる可能性があることを追記しています。 [ruby-core:42832] [Bug #6068]

drbrain:r34770 2012-02-24 07:36:40 +0900

Object#eql? equal? == などの rdoc にサンプルの追記と eql? が hash の同値と包含関係にないといけないことなどを追記しています。

drbrain:r34771 2012-02-24 08:03:39 +0900

Hash の rdoc にも Hash のキーを同定するために hash と eql? を使うよということを追記しています。
まーこのあたりは old fashion な Rubyist にとっては FAQ だと思うのですが rdoc には書かれてなかったんですね。 Hash のキーに Array などをつかって後から破壊的操作するとまずいことになるとか。

tenderlove:r34772 2012-02-24 08:12:57 +0900

Psych のパーサーが渡された文字列や IO の external_encoding から取得した Encoding をセットするようにしています。でもテストをみると parse(Psych.load) した結果に含まれる文字列は UTF-8 になるみたいですね。

drbrain:r34773 2012-02-24 08:15:44 +0900

profiler.rb の使い方などの基本的なドキュメントを rdoc に追加しています。

drbrain:r34774 2012-02-24 08:16:21 +0900

ChangeLog のタイムスタンプの修正しています。サマータイムの修正忘れかな?

drbrain:r34775 2012-02-24 08:35:21 +0900

profiler.rb の rdoc 追記部分の余分な空白を削除しています。

nobu:r34776 2012-02-24 08:52:12 +0900

シングルクオート文字列の中での non-ascii 文字の直前のエスケープシーケンスでないバックスラッシュは削除されていたのですが、文字列のなかにバックスラッシュそのものとして含めるようにしています。 [ruby-dev:45278] [Bug #6069]
このチケットの主張は多分シングルクオートの時だけのことだと思うのですが、この修正はダブルクオートも含めてバックスラッシュを残すようになっています。

"\z" # => "z"

'\z' # => "\\z"

このように違いがあるので non-ascii 文字も同じようにしようってことではないかと。

drbrain:r34778 2012-02-24 09:10:53 +0900

Complex::I 定数に (0+1i) という rdoc を追記しています。 [ruby-core:40968] [Feature #5623]

drbrain:r34779 2012-02-24 10:10:07 +0900

Net::HTTP#transport_request で EOFError や Errno::ECONNRESET が発生した時(keep-alive で接続したままのソケットをサーバ側から切断された等)に retry 文でリトライ(再接続)するようになっていましたが、メソッド全体にかかる rescue 節で処理していたため何度目の実行かをカウントする count 変数までリセットしてやりなおされていて何度でもリトライを続けるようになっていたので begin 節を入れています。

ayumin:r34780 2012-02-24 11:56:30 +0900

String#prepend の rdoc のインデント修正。

ayumin:r34781 2012-02-24 12:10:25 +0900

Net::HTTP.start の rdoc のサンプルコードの間違い修正。

ayumin:r34782 2012-02-24 12:15:10 +0900

r34780 の ChangeLog エントリに同じ pull request がもうひとつあったので追記しています。

tenderlove:r34783 2012-02-24 13:55:33 +0900

Psych.parse で内部で @handler のメソッドを呼んでいるところで例外や大域脱出の発生を考慮していなくて yaml_event_t の解放されずメモリリークする可能性があったので rb_protect() 経由で呼ぶように修正しています。
うーんこのスタック上にとった VALUE の配列を VALUE にキャストして rb_protect() に渡しているところが嫌な感じがするのですが、スタック上に VALUE が置かれるはずなので(ポインタを渡しているし)マーク漏れはしなさそうだし、この前修正されたような block の Proc オブジェクト化のような問題*1は rb_protect() だとなさそうなので実害はないかなぁ。

nobu:r34784 2012-02-24 15:49:09 +0900

呼ぶと必ず帰ってこない関数のあとなど処理が到達しない場所に /* unreachable */ とコメントすることでコンパイラの警告を抑制することができたりしますが、 clang が __builtin_unreachable() という built-in 関数で指定できるので configure でチェックしてあればそれを UNCHEACHABLE というマクロに定義するように(なければ /* unreachable */ というコメントとして定義)しています。 [ruby-core:42849] [Bug #6066]

nobu:r34785 2012-02-24 16:13:24 +0900

io.c の set_binary_mode_with_seek_cur() の宣言の体裁と、inline static -> static inline と順番の入れ替えしています。

nobu:r34786 2012-02-24 16:37:48 +0900

dir.c, file.c, io.c の SystemCallError (Errno::EXXX といったシステムコールや標準ライブラリが errno にエラーを返した時の例外)を発生させる時に rb_sys_fail() を呼んでいたところを rb_sys_fail_path() に変更しています。この段階だと rb_sys_fail_path(path) は単に rb_sys_fail(RSTRING_PTR(path)) と同じです(関数マクロ)。

nobu:r34787 2012-02-24 16:39:59 +0900

rb_sys_fail() のような処理がかえってこない関数(NORETURN つきで宣言されている)だと RSTRING_PTR() で文字列オブジェクトのバッファのポインタを渡す方式だと、RB_GC_GUARD() をその後に置いても効かない可能性があり、引数に一時的に生成したオブジェクトを使うとコンパイラの最適化の影響で例外生成処理中に GC される危険が排除しきれせん。
このため文字列オブジェクトそのものを受け取る関数 rb_sys_fail_str()、rb_syserr_fail_str() などを追加しています。

nobu:r34788 2012-02-24 16:48:34 +0900

dir.c, file.c, io.c でさらに rb_sys_fail() を rb_sys_fail_path() に置換し、rb_sys_fail_path() は rb_sys_fail_str() を呼ぶように定義を変更しています。またこのために C の文字列でだけパスを受け取っていた関数に VALUE 型で String オブジェクトも渡すように引数の追加をしています。

shyouhei:r34789 2012-02-24 17:58:24 +0900

0x00 + 2 が 2 になるというテストを追加しています。どうも最近そういうバグが PHP でみつかって修正されたらしくて、多分一種の Joke なのでしょう。 参考URL: https://bugs.php.net/bug.php?id=61095

nahi:r34790 2012-02-24 18:25:14 +0900

Zlib::GzipReader#read のテストに結果の文字列の Encoding についてのテストケースを追加しています。引数で読み込みサイズを指定すると ASCII-8BIT に、指定がなくて全て読み込むと Encoding.default_external になります。JRuby でこういう挙動を修正したので CRuby にもテストを追加したということのようですね。最近 JRuby では CRuby の test-all のテストを動かすことができるようになった(除外しているテストもあるそうですが)そうです。 参考URL: http://bugs.jruby.org/6208