ruby-trunk-changes r32423 - r32437

今日は gem_prelude の廃止以降、起動が遅くなっていた問題の解決と、Fiber 用の mmap(2) の FreeBSD 向けの対応などがありました。

sorah:r32423 2011-07-06 22:13:09 +0900

r32415 で CGI のテストで Date ヘッダはフォーマットだけ確認するようになっていたのを、生成する前後の時刻を取得してその範囲に収まるかという方法で時刻のチェックも復活させています。

matz:r32424 2011-07-07 00:39:27 +0900

r32235 でメソッド呼び出しの引数の区切りのカンマが行末にあるのを禁止した影響で、ハッシュ引数(オプション引数)の最後のカンマがエラーになっていたのを再修正。 [ruby-dev:44039] [Bug #3456]

svn:r32425 2011-07-07 00:39:32 +0900

version.h の日付更新。

usa:r32426 2011-07-07 00:43:38 +0900

Windows版(x64-mswin64)で testunit の parallel test 機能のテストで Process.kill が Errno::EPERM を発生させてしまうという問題の対応です。WindowsAPI はよくわかりませんが、pid に対応するプロセスの HANDLE の取得方法を少し変更しているのと、TerminateProcess() を呼ぶ直前にプロセスがまだ生きているかどうかの確認をするようにしています。また wunlink() で DeleteFileW() を呼んでファイルの削除後に GetFileAttributeW() で ERROR_FILE_NOT_FOUND を返すようになるまでループで待つようにしています。DeleteFileW() が返ってきてから「実際に消える」(というか API から消えたように見える)までラグがあるみたいですね。 [ruby-dev:43990] [Bug #4943]

nobu:r32428 2011-07-07 04:31:33 +0900

Ripper が rescue を修飾子として使う構文(後置 rescue) を rescue の前後を逆にしたノードを返してしまう不具合を修正しています。 [ruby-core:36248] [Bug #4716]

drbrain:r32429 2011-07-07 06:19:59 +0900

rubygems で Gem.clear_paths の呼び出しを lib/rubygems.rb から lib/rubygems/specification.rb へ移動して、lib/rubygems/dependency_list.rb と lib/rubygems/path_support.rb の require を autoload を使って遅延しています。 これは gem_prelude の廃止に伴なってインタプリタの起動時間が遅くなってしまったことに対する対処です。これでマイクロベンチマークの結果は --disable-gems なしでも 1.9.2 に比べで起動が早くなっているそうです。素晴しい! [ruby-core:37730] [Bug #4962]

drbrain:r32430 2011-07-07 06:47:56 +0900

make benchmark で BASERUBY と RUNRUBY での結果(実行時間)の差を表示する機能を benchmark ライブラリに追加しています。 [ruby-core:37822] [Feature #4982]

drbrain:r32431 2011-07-07 06:50:58 +0900

make benchmark した時に生成される bmlog ファイル群を無視するように svn:property に設定。

naruse:r32432 2011-07-07 06:57:16 +0900

r32420 で MAP_STACK が定義されていれば mmap(2) に渡す prot のフラグに追加するようにしましたが、FreeBSD ではこれをやめるようにしています。理由は r32437 で追記されています。

naruse:r32433 2011-07-07 15:23:40 +0900

numeric.c の rb_num2ull() で Float からの変換の処理(やその他の例外処理)を rb_num2ll() (unsigned なし版)を unsigned LONG_LONG にキャストするだけにしていたのを自前で同様の処理をするようにしています。signed LONG_LONG で返させて unsigned LONG_LONG にキャストする方法だと 18446744073709551615 = 0xffffffffffffffff を処理することができません。

nobu:r32434 2011-07-07 15:40:33 +0900

拡張ライブラリを利用した API テスト用のコードのうち ext/-test-/string/init.c から ext/-test-/string/modify.c へ String#modify! メソッドの定義部分を分離しています。他にもメソッドが追加されて分離されているのでそれらとの対称性のためのコード整理だと思います。

nobu:r32435 2011-07-07 15:44:46 +0900

rb_enc_associate() (文字列等に Encoding を関連付ける関数)で引数の obj が feeze されていたら例外を発生させるようにしています。また parse.y や ruby.c で内部的に保持する String を freeze するようにしています。[追記]freeze はもともとやっていたことですが、rb_enc_associate() が frozen な文字列で例外になってしまうので、その後で freeze するようにタイミングをずらしただけでした[/追記]
また拡張ライブラリを利用してこの API を呼ぶテストを追加しています。

usa:r32436 2011-07-07 17:56:12 +0900

testunit の並列テストで子プロセスとの通信用の pipe への書き込みに失敗した時にも Process.waitpid の呼び出しはするようにしています。

kosaki:r32437 2011-07-07 18:09:44 +0900

r32432 で FreeBSD では Fiber のスタック用 mmap に MAP_STACK を渡さないようにする理由をコメントで追記しています。 FreeBSD では MAP_STACK を指定する時には第1引数の addr に NULL 以外の値を指定しないといけないそうです。