ruby-trunk-changes r34016 - r34032

今日は Proc への引数の処理の不具合修正、Ripper のマジックコメント処理の修正、WEBrick の一部のステータスでの接続を Keep-Alive にする変更、複数Thread で同じファイルを require する時のレースコンディション修正、NameError 例外の文字列化の不具合修正、メソッドチェーンをつなげた時の行番号が正確になるようにする修正など、たくさんありました。

shugo:r34016 2011-12-12 22:43:56 +0900

BEGIN { ... } という文法でインタプリタに最初に実行する処理のブロックを指定できるのですが、この文はトップレベルでしか記述できないように 1.9 から変更された(1.8 でもメソッド内での記述は禁止されていた)のですが、その時の SyntaxError のメッセージが古いまま("BEGIN in method")だったので、ルールも少し変更して、トップレベルの文でないところで記述されたら "BEGIN is permitted only at toplevel" というメッセージになるようにしています。 [ruby-dev:44963] [Bug #5738]

nobu:r34020 2011-12-13 05:50:09 +0900

Ruby には lambda でないブロックの引数にひとつの配列を渡した時は、その配列を各要素に分解したものを引数とする、という仕様があって([ruby-dev:38795] も参考のこと)、このブロックに省略可能引数(ブロックパラメータ)があった時にこの仕様に適っていなかった不具合を修正しています。また Proc オブジェクトの呼び出しと引数の関係のテストを多数追加しています。 [ruby-core:41557] [Bug #5730]

svn:r34021 2011-12-13 05:50:14 +0900

version.h の日付更新。

nobu:r34022 2011-12-13 06:29:53 +0900

Ripper でマジックコメントを parse した時にブロックに渡される文字列が正しくコピーされていなかった不具合を修正しています。 [ruby-dev:44984] [Bug #5753]

tenderlove:r34023 2011-12-13 07:15:31 +0900

WEBrick でレスポンスの status が 204 (No Content) か 304 (Not Modified) の時に接続を切断せずに Keep-Alive を有効にするようにしています。 [ruby-core:41581] [Bug #5737]
テストの内容を見るかぎり 204, 304 の時に Content-Length が決まらないという警告メッセージを出して close することを問題にしているようです。多分接続が切れるのはかまわないのではないかなとも思いますが、チケットで議論が継続しているようです。

tenderlove:r34024 2011-12-13 07:33:56 +0900

さらに HTTP のステータスコード 1XX 系の時も接続を切らないようにしています。

ktsj:r34025 2011-12-13 13:33:30 +0900

ChangeLog の余分なタブ文字削除。

nobu:r34026 2011-12-13 16:12:37 +0900

新規追加されたファイルの svn property 追加。

nobu:r34027 2011-12-13 16:13:31 +0900

require でライブラリをロードする時に同じファイルを同時に読まないようにファイルパス単位のロックが存在するのですが、ロード後の load_unlock() の処理でテーブルからファイルパスに対応する Barrier オブジェクトを削除してしまっていたので、同じファイルをロードしようと待っている別の Thread があった場合にロックが漏れているタイミングがあったのを修正しています。かなり複雑な条件ですね。 [ruby-core:41618] [Bug #5754]
ところで rb_barrier_waiting(barrier) で待っている Thread がいた時に rb_barrier_destroy() を呼んでしまっていいんでしょうか? Barrier から Mutex への参照を切ってしまうので後続の Thread の Barrier の操作ができなくなりそうな気がするのですが。
[2011-12-14 追記] Barrier の使われかたを勘違いしていました。正常終了の開放時に destroy するのは Barrier の通常の使いかたです。rb_barrier_release() をみて大丈夫かなと思ってたのですが、destroy したらそもそも後続の待たされている Thread は Barrier の取得に失敗するので release をしないはずです。[/追記]

nagachika:r34028 2011-12-13 23:50:12 +0900

NoMethodError を文字列化する時に、保持している receiver の情報を文字列化するため inspect を呼ぶのですが、そこで例外が発生した時にその例外は無視して rb_any_to_s() を使った文字列化で代替します。しかしこの時 Thread の構造体の rb_thread_t::errinfo というメンバに例外情報が格納されたままになっていたため、一旦は例外が無視されても require/load などから抜けた時に再度その例外が発生されてしまう不具合を修正しています。[ruby-core:41612] [Bug #5755]

nagachika:r34030 2011-12-13 23:56:12 +0900

r34028 の ChangeLog エントリに ML とチケットの参照を追記。

nobu:r34031 2011-12-14 00:01:20 +0900

ブロックつきメソッドをメソッドチェーンで複数繋げた時に、ブロックの Proc#source_location の行番号がメソッドチェーン全体の最初の行に固定になってしまうので、各メソッド毎に分解して細かく行番号をASTのノードに格納しておくように parse.y のルールを変更しています。これにより行番号が変化するので compile した YARV の命令列に trace 命令が細かく入るようになって実際にブロックの定義された行が保持されるようになります。 [ruby-core:40936] [Bug #5614]

svn:r34032 2011-12-14 00:01:32 +0900

version.h の日付更新。