ruby-trunk-changes r41034 - r41046

今日は Socket::Option のメソッドの改名や昨日のエンコーディング名の改名(修正)の残りのほか、readdir_r() をやめて readdir() を使うようにする変更などがありました。

naruse:r41034 2013-06-02 23:24:34 +0900

r41009 で導入した拡張ライブラリ socket の Socket::Option.ip_multicast_loop, ip_multicast_loop をそれぞれ ip -> ipv4 と改名しています。 IPv4 専用のソケットオプションだったんですね。

ktsj:r41035 2013-06-02 23:36:41 +0900

r41024 でエンコーディングEUC-JP-2004 を EUC-JIS-2004 に修正したのですが enc/trans/japanese_euc.trans および tool/transcode-tblgen.rb やテストで修正漏れがあったので追加修正しています。

naruse:r41036 2013-06-02 23:46:43 +0900

test/ruby/test_transcode.rb で Encoding.default_internal を変更するためにユーティリティ EnvUtil.with_default_internal を利用するようにしています。警告の抑制や例外などを考慮した復旧を行なってくれます。

naruse:r41037 2013-06-03 00:59:18 +0900

r41034 での Socket::Option のメソッドの改名にテストも追随しています。

svn:r41038 2013-06-03 00:59:23 +0900

version.h の日付更新。

ayumin:r41039 2013-06-03 01:15:51 +0900

r41034 での改名のもうひとつ Rinda のテストでも利用していたところも追随しています。 naruse さんがテストの修正漏れをするの珍しいですね。

ayumin:r41040 2013-06-03 01:37:14 +0900

r41037 で r41034 のメソッド改名に追随したテストですが、ついでにテストメソッド名もそろえるように改名しています。

naruse:r41041 2013-06-03 03:44:33 +0900

r41034 で不要だとして消されていた else 節を復活させています。 arg0 = argv[0]; と代入したものを argv[0] = arg0; と戻しているだけだったので不要にみえたのですが、実は if の条件の中の rb_check_array_type() で to_ary メソッドの呼び出しがあると argv[0] が書きかえられる可能性があるので、それを書き戻すために必要だったのでした。

kosaki:r41042 2013-06-03 07:38:11 +0900

dir.c でディレクトリ走査のため readdir_r(3) を利用していたのをやめて readdir(3) を使うようにして、それに伴なって configure のチェックなど不要になったものを削除しています。 readdir_r() を使わなくていいのかという議論が Twitter 上で流れてて、追い切れませんでしたが、同じ Dir オブジェクトを複数の Thread で同時に read すると競合が起きる(これは当然)し、dup して複製を作っても環境によっては位置の制御が干渉してしまうことがある、みたいな話になっているみたいでした。
この変更の影響はどこか読み返しやすいところに書いてて欲しいですね。

[追記]などと書いていたら kosaki さんがブログに readdir_r(3) がなぜだめなのかをまとめてくださいました。ありがとうございます!
「革命の日々! readdir_r は使ってはいけないという話」
[/追記]

naruse:r41043 2013-06-03 11:37:34 +0900

Kernel#fork および Kernel#spawn の rdoc コメントに、fork はいくつかのプラットフォームで動かないので spawn 推奨ということと、spawn のサンプルコードとして実行しているrubyインタプリタを実行するサンプルを追加しています。

xibbar:r41044 2013-06-03 11:38:32 +0900

標準添付ライブラリ cgiCGI::Cookie#inspect メソッドを追加して、クラス名と to_s した結果を含む表記にして返すようにしています。

nobu:r41045 2013-06-03 17:16:27 +0900

r41041 で復活させた else 節になぜこれが必要なのかをコメントで追記しています。

nobu:r41046 2013-06-03 19:02:39 +0900

dir.c でファイルシステムが HFS かどうかを検出するためにパス名を使って statfs(2) していたのを dirent の file descriptor を使って fstatfs(2) で直接ファイルシステム情報を取得するようにリファクタリングしています。