ruby-trunk-changes r30336 - r30370

今日は一転してたくさんのコミットがありました。Zlib::GZipReader のメソッドが IO のメソッドと互換性があるように拡張されていたり、csv ライブラリのエンコーディングの扱いの修正と option 引数のエンコーディング指定の拡張、Socket::Option の ipv6 関係のオプションの表示(inspect)の拡張などの変更があります。また PTY.open や popen などで fork した子プロセスが固まってしまう可能性がある不具合の修正が行なわれています。

nobu:r30336 2010-12-25 10:49:59 +0900

ext/openssl/ossl_pkcs5.c に型のキャストを追加(おそらく警告除去)。

svn:r30337 2010-12-25 10:50:02 +0900

version.h の日付更新。

nobu:r30338 2010-12-25 10:51:06 +0900

json の拡張ライブラリで未使用の関数(fbuffer_free_only_buffer)を削除。ChangeLog は関数名が違ってますが後で修正されています。

nobu:r30339 2010-12-25 10:54:28 +0900

test/zlib/test_zlib.rb でテストのメソッド名を変更。

nobu:r30340 2010-12-25 10:59:15 +0900

拡張ライブラリ zlib の gzfile_read, gzfile_readpartial などの len を int から long に変更。
rb_gzreader_read などで len を NUM2INT で VALUE から変換しているところも NUM2LONG にしなくていいのかな、と思ったのですが、NUM2INT は long と int のサイズが違ってて int に収まらない数値だったら例外が発生するようなので、int の幅を越えるような len を渡す(おそらく大きすぎる)のを弾くという意味でこれで良いのかもしれません。

nobu:r30341 2010-12-25 11:02:55 +0900

Zlib::GZipReader#gets, #readline, #readlines, #each など gzreader_gets() を利用するメソッドに読み込む文字数byte数を制限する引数を追加して IO のメソッドの挙動と揃えています。[追記]ただしマルチバイト文字列だと指定された byte を越えて次の文字境界までとなります。なかださんにコメントで指摘頂きましたが文字数での指定ではなくて byte 数での指定でした。コメントありがとうございます。[/追記]

drbrain:r30342 2010-12-25 11:07:13 +0900

require_relative の rdoc を追加しています。

nobu:r30343 2010-12-25 12:48:57 +0900

r30342 で rb_f_require_relative の戻り値の宣言が消えてしまっていたので復活。

akr:r30344 2010-12-25 13:08:22 +0900

random.c の関数マクロの引数にかっこをつける修正です。

ryan:r30345 2010-12-25 13:24:37 +0900

r30222 の ChangLog のエントリを追加。

nobu:r30346 2010-12-25 13:49:34 +0900

拡張ライブラリ版 json のヘッダの未使用の関数の宣言 fbuffer_free_only_buffer() を削除。

ryan:r30347 2010-12-25 13:55:15 +0900

minitest 2.0.2 (r6093) を取り込んでいます。主に rdoc のためのコメント追加で、MiniTest::Spec.bench_range が初回にブロックなしで呼ばれた時にデフォルトの挙動をするように修正しているだけのようです。

ryan:r30348 2010-12-25 14:01:32 +0900

minitest/unit.rb で未使用の変数による警告除去。

nobu:r30349 2010-12-25 14:27:12 +0900

open のオプション引数 :encoding に文字列で表現したエンコーディングじゃなくて Encoding オブジェクトそのものを渡した時に例外になっていたので受け付けるように修正。

kosaki:r30350 2010-12-25 14:31:04 +0900

make test-all で test_getpty_nonexistent がブロックしてしまう件の修正。GVL の修正で fork 後に GVL の初期化をしないといけないのですが pty.c がそれをすりぬけていたので追加しています。[Bug #4121]
しかし kosaki さんによるとここだけでなくて popen などもまずいし、そもそも fork 自体が実は GVL 初期化前に利用してたりするそうなので fork, exec あたりはいずれもうすこし大規模に修正が入りそうです。[ruby-dev:42858]

nobu:r30351 2010-12-25 15:04:07 +0900

csv のテストでテストのディレクトリに一時ファイルを作ろうとしているものがあったので Tempfile を利用するように修正。

kosaki:r30352 2010-12-25 15:28:05 +0900

signal.c でシグナル受信のカウンタに使っている rb_atomic_t を unsigned char から unsigned int に変更しています。
そういえばこれは #4027 で ATOMIC_INC のあたりを読んだ時に、これ max 255 でいいのかな、とちょっと疑問に思ってたんですよね。思ったときに言っておけばよかった。そして #4027 はもう閉じてしまっていいような。

nobu:r30353 2010-12-25 15:58:58 +0900

csv で $, (デフォルトのフィールド区切り文字。Array#join などで引数省略時に利用)が変更されているかもしれないので引数を省略しないようにして $, の値に依存しないように修正しています。
また csv のテストでこの点をチェックするために $, を変更してテストを実行するように helperメソッド(with_different_ofs) を用意して利用しています。

nobu:r30354 2010-12-25 16:04:38 +0900

CSV.foreach で option から :encoding の情報を抜いてわざわざ mode 引数の文字列を作りなおしているのでそのまま option を open に渡すように修正。また CSV#initialize で option に :encoding, :internal_encoding を受けとって利用するように変更しています。

nobu:r30355 2010-12-25 16:44:50 +0900

CSV#initialize に渡すオプション :encoding に文字列だった場合にコロン区切りをケアするのと、 options に値が残ったままだと後で ArgumentError を発生させていたので掃除するように。また CSV.foreach では options に :mode が含まれていた時に open に余分な引数を渡してしまっていたのを修正。

nobu:r30356 2010-12-25 17:32:27 +0900

csv.rb で read_to_char というメソッドを使って独自に読み込みとエンコーディングの変換をしていたらしいのを IO#gets の文字数制限の引数の機能を利用するように変更。エンコーディングの変換に失敗するケースで不具合があった(変換そのものに不具合?)のを修正しているそうです。

nobu:r30357 2010-12-25 17:33:58 +0900

csv のテストで $, の変更のための helper メソッドで生成するクラスを名前をセットするようにしています。
クラスに名前をつけておかないと make test-all TESTS="-v" などでテストケースの名前を表示させた時に みたいになってしまうからですね。

kosaki:r30358 2010-12-25 17:50:53 +0900

rb_thread_atfork で rb_reset_random_seed を呼んでいるところに参考情報としてコメントに CVE-2003-0900 を記述。

naruse:r30359 2010-12-25 18:02:03 +0900

openssl の test で OpenSSL::X509::Request#sign に渡す digest に DSS1 はサポートされていなかったので assert_raise していたようですが、OpenSSL 1.1 は RSA1024 と DSS1 をサポートするようになったので例外にならず動くということで、テストを書き直しています。例外が発生したら rescue で無視。

nobu:r30360 2010-12-25 18:04:33 +0900

CSV.foreach で open に渡す mode 引数('rb')は削除。
また CSV#initialize でエンコーディングの設定の優先順位の変更や :internal_encoding に文字列が渡された時に Encoding.find で Encoding に変換する(不正な文字列なら例外発生させる)などの追加の修正。ChangeLog のエントリには (CSV#init_separators) と書かれていますが CSV#initialize の修正ですね。

akr:r30361 2010-12-25 18:29:24 +0900

socket 拡張ライブラリで Socket::Option#inspect で IPV6_JOIN_GROUP と IPV6_LEAVE_GROUP のオプションの時に struct ipv6_mreq 構造体の情報をきれいに表示するように処理を追加しています。

kosaki:r30364 2010-12-25 19:22:48 +0900

popen や open に "|cmd" のようにパイプコマンドを引数として渡した時の pipe_open() でも rb_fork() で fork した子プロセスで rb_thread_atfork() を呼んで GVL を初期化するようにしています。

nobu:r30366 2010-12-25 22:04:43 +0900

r30357 で $, を変更して csv のテストを流すようにしたしくみが、テストケースの中で直接 setup を呼んでいるものがあったせいで $, = "-" がほかのテストに影響してしまっていたのでテストケースを分割しています。

nobu:r30367 2010-12-25 22:08:07 +0900

csv のテストの DifferentOFS モジュールを使って $, を変更してテストを走らせるしくみを test/with_diffent_ofs.rb に分離しています。メタプログラミングを駆使している感じです。けどファイル名は with_different_ofs.rb?
また test/digest/test_digest_extend.rb で String#join を引数省略して呼んでいるために $, の変更で影響を受けてしまっているので明示的に空文字列を引数に指定するように修正しています。

nobu:r30368 2010-12-25 22:32:48 +0900

digest のテストケース内で Digest::Class を継承した MyDigest クラスの特異メソッドを定義していて、影響がほかのテストケースに漏れているのでテストケース毎に無名のサブクラスを生成して利用するように修正しています。

nobu:r30369 2010-12-25 22:41:11 +0900

with_different_ofs(.rb) のファイル名とメソッド名の typo が修正されています。

nobu:r30370 2010-12-25 22:49:14 +0900

DifferentOFS モジュールが各サブクラスが直接 include しないといけないようになったので csv の各テストクラスで include するように。これは with_different_ofs メソッドの呼び出しで呼び出し元の Class のサブクラスを生成していたのを、included フックメソッドを使って include するだけで同じことをするようにしたのでそのかわり include は各サブクラスでしておかないといけなくなったというわけです。
メタプログラミングRuby」を読んでてよかった。