ruby-trunk-changes r30536 - r30544

今日はちょっと要注意のコミットがありました。r30538 の組み込みのrubygemsのロード方法変更の影響でインタプリタの起動に時間がかかるようになっていますので、用途によっては注意が必要です。どっちみち RubyGems 使うからって場合は変わらないのかも。あと trunk を普段使いにしている人はそんなに居ないかもしれませんね。わたしは使ってるんですけども。

nobu:r30536 2011-01-14 07:30:50 +0900

存在しないファイルを引数に指定して

ARGF.gets rescue nil
ARGF.gets

とすると SEGV してしまう不具合を修正しています。[ruby-core:34446] [Bug #4274]

svn:r30537 2011-01-14 07:30:52 +0900

version.h の日付更新。

ryan:r30538 2011-01-14 11:02:12 +0900

1.9 には RubyGems が組込みになっていますが、RubyGems を常にロードしてしまうと起動が遅くなってしまうため gem_prelude というインタプリタに埋め込まれたスクリプトでいろいろ頑張って require をラップしたりして遅延ロードするようにしていた(と思います。昔ちょっと調べただけなので詳細はあやふや)のですが、最新版の RubyGems 1.4 がこの gem_prelude と互換性がなくなって trunk で動かなくなっているというのを発端にして、gem_prelude は単に require "rubygems" するだけになっています。また --disable-gems を付けるとこれを抑制できるのでテストのいくつかに --disable-gems オプションを付けて起動するように追加しています(全ては網羅していないです)。あと WEBrick のテストの変更は直接関係なさそうですが混ざっているみたいです。
しかしこれで起動がかなり遅くなったようです

% time ruby -ve ""
ruby 1.9.3dev (2011-01-12 trunk 30527) [x86_64-darwin10.6.0]
ruby -ve ""  0.01s user 0.00s system 89% cpu 0.020 total

% time ruby -ve ""
./ruby-trunk -ve ""  0.30s user 0.03s system 47% cpu 0.706 total

何度か繰り返してみるとだいたい 20倍から30倍くらいになっているようです。make test-all も子プロセスとして起動するものが多いみたいで遅くなったような気がします。
[ruby-core:34478] あたりを読むと、最新版で動かなくなるのはまずいからとりあえず動くようにして遅いのはこれからまた早くする方策考えればいいでしょ、みたいな感じでそれはそれで動くようになればいいのですが、まだちょっと怖くて RubyGems アップデートしていません。リリース版については多くのユーザが結局 RubyGems を使うと思うので動くようにならないとまずいですが trunk を日常的に使っているのは主に開発者のような気がするので、この修正の処遇はどうなるでしょう。反対意見も出てるようですし。

あとこれを入れてから test/ruby/test_dir_m17n.rb で WARNING が出るようになりました。bundler.gemspec が UTF-8 の文字を含んでいるのに、テストで default_internal を EUC-JP にして起動するものがあるためです。とりあえず --disable-gems を入れて回避してみましたがこれもどうするのか。テストのあちこちに --disable-gems を入れてまわることになるんでしょうか。

usa:r30539 2011-01-14 11:37:34 +0900

make test 等で利用する RUNRUBY のコマンドラインで miniruby に対して -I. オプションを渡すように追加しています。rbconfig.rb をロードするためだそうです。 r30539 の影響で顕在化したものでしょうか?

naruse:r30540 2011-01-14 13:51:34 +0900

32bit でおさまらないサイズのファイルを圧縮した zip ファイルを Zlib::Gzipreader で読むとエラーになるのを修正。読み込んだサイズの比較で型キャストを追加しています。両辺とも型は unsigned long ですが、gzip ファイルのフッタからは 32bit の値しか取れないので下位32ビットだけで比較してチェックするみたいです。 [ruby-core:34481] [Bug #4278]
参考URL: http://www.ietf.org/rfc/rfc1952.txt

naruse:r30541 2011-01-14 13:54:51 +0900

r30540 は int32_t にキャストしていたので uint32_t に変更しています。

naruse:r30542 2011-01-14 14:03:22 +0900

unpack("M") の返す文字列が 7bit(ASCII)の範囲じゃないのに US-ASCII になっていたので ASCII-8BIT のエンコーディングの文字列を返すように修正。 [ruby-core:34482] [Bug #4279]

naruse:r30543 2011-01-14 14:57:50 +0900

Net::IMAP で非ASCII範囲のバイトを含むデータ送信時にバイト数(String#bytesize)を渡すべきところを文字数(String#length)を使用していたのを修正しています。[ruby-core:34222] [Bug #4249]

shugo:r30544 2011-01-14 15:38:32 +0900

Net::IMAP のテストで ensure で logout, disconnect などの後始末のメソッドを呼ぶ時に必要かどうか確認してから呼ぶようにケアしています。[ruby-dev:42860]