ruby-trunk-changes r38539 - r38556

今日は LLP64 環境での不具合修正、Fiber 内での Thread.exit の不具合修正、Net::HTTPRequest/HTTPResponse の uri メソッドの追加などがありました。

usa:r38539 2012-12-22 00:30:44 +0900

rb_obj_hash() で object_id が LLP64 環境(Windows の 64bit 版 VC++)だと long 型のサイズに納まらないのに NUM2LONG() で変換していたため上位32bitが捨てられていてテストに失敗していたのを修正しています。 [ruby-core:51060] [Bug #7454]

svn:r38540 2012-12-22 00:30:53 +0900

version.h の日付更新。

zzak:r38542 2012-12-22 02:08:24 +0900

irb の定数 IRB::INSPECTORS を IRB::Inspector::INSPECTORS に移動し、メソッドも IRB::Inspector のクラスメソッドに移動しています。 [ruby-core:51067] [Bug #7598]

kosaki:r38543 2012-12-22 02:21:12 +0900

r38533 で vm_dump.c で $0 を上書きしていた時のために rb_dump_backtrace_with_lines() を呼び出すのをやめるようにした応急措置を元に戻し、ファイルを読み来んだ時に先頭のマジックナンバを確認して ELF 形式のファイルか確認するようにしています。元の実行形式ファイルとは別の実行形式ファイルに改名してたらとかそういうケースも考えられますが、まあそんなことしないだろ普通、ということでしょう。 [ruby-dev:46786] [Bug #7597]

zzak:r38544 2012-12-22 02:29:18 +0900

irbIRB::InputMethod の readable_atfer_eof? というメソッドの typo を修正してメソッド名を readable_after_eof? に改名しています。 [ruby-core:51069] [Bug #7599]

zzak:r38545 2012-12-22 02:36:14 +0900

irbIRB::SLEX#match で定数の参照が D_DETAIL が D_DEATIL になっていたのを修正しています。こっちはここだけ間違っていたので通ったら NameError になってたはずですね(つまりテストで通ってない)。 [ruby-core:51071] [Bug #7600]

drbrain:r38546 2012-12-22 05:36:07 +0900

Net::HTTPRequest にリクエストする URI のパスのみでなく URI そのものも保持して uri メソッドで取得できるようにしています。また Net::HTTPResponse にも uri メソッドでそのレスポンスの元になったリクエストの URI を取得できるようにしています。[ruby-core:45193] [Feature #6482]

glass:r38547 2012-12-22 11:52:48 +0900

Struct のメンバー名に nul 文字("\000")を含むような文字列が利用されても許容するようにチェックを外してします。 define_method はこのような名前でも受け付けるんですね。 ドットを使った記法では呼べなさそうですけど。 [ruby-dev:46750] [Bug #7575]

shirosaki:r38548 2012-12-22 13:25:18 +0900

r38493 で LLP64 環境のために object_id の扱いを修正したのに追随して id2ref() と wmap_finalize() でも同様の不具合があったのを修正しています。 object_id として Fixnum が渡された場合しか考慮されていなかったので、Bignum の時のことを考慮した obj_id_to_ref() という関数マクロを導入してこれを使うようにしています。

kazu:r38549 2012-12-22 14:00:00 +0900

r38544 の ChangeLog のエントリを修正しているのですが、これは typo の修正元の名前を修正してしまっているので誤りですね。

nagachika:r38550 2012-12-22 15:45:28 +0900

Thread 内の Fiber 内で Thread.exit しても Fiber から抜けるだけで Thread が終了しない不具合の修正です。
Thread.exit は同期的な割り込みとして rb_thread_t::errinfo に INT2FIX(TAG_FATAL) を入れて TAG_FATAL で TAG_JUMP() する(longjmp(3) する)のですが、Fiber の終了時にはマシンスタックが別なので、一旦これを非同期例外用の async_errinfo_queue に入れておいて切り替え後に再発生させないといけませんでした。 r38414 では誤ってここで Thread を終了させるための割り込みを(後続の処理がそれに対応していなくて例外が発生していたのを修正しようと思って)握り潰してしまっていたので、そうではなくて async_errinfo_queue に INT2FIX(TAG_FATAL) が入っていることを想定するように rb_threadptr_execute_interrupts() で対応を追加しました。 また r38441 で rb_vm_make_jump_tag_but_local_jump() に TAG_FATAL が渡される時も考慮しましたが、渡すことはなくなるのでこれを revert しています。 改めてみると rb_fiber_start() の条件分岐はまとめることができますね。

nobu:r38551 2012-12-22 19:26:40 +0900

Module#const_get に "Foo::" のように末尾に "::" がついている文字列も許容されていたので、チェックして例外を発生させるようにしています。 [ruby-dev:46748] [Bug #7573]

nobu:r38552 2012-12-22 19:40:03 +0900

const_get の実装で rb_mod_single_const_get() という関数に切り出されていた部分を展開して、定数名のための文字列を String オブジェクトにしないでそのまま処理するようにして不要なオブジェクト生成を避けるようにしています。

nobu:r38553 2012-12-22 20:31:13 +0900

const_get で :"A::C" のようにネストした名前を Symbol で与えたら例外になるようにチェックを強化しています。
んーでも Object.const_get("A::C") のような String でネストした名前を取得することはできるようになっている(r37335 や r37494 なのでわりと最近ですが)ので Symbol の時だけ弾くのはなにか理由があるんでしょうか?

nagachika:r38554 2012-12-22 21:52:31 +0900

r38549 の ChangeLog の修正を元に戻しています。

kosaki:r38555 2012-12-22 22:02:12 +0900

rb_io_wait_readable() および rb_io_wait_writable() で errno == EINTR 時に rb_thread_wait_fd() や rb_thread_fd_writable() を呼んで対象の fd が読み込み/書き込み可能になるのを待っていたところを、rb_thread_check_ints() を呼んで return するようにしています。
ソース中に追記されたコメントによると古い Linux で /proc や /sys のファイルに対して select(2) が正しく動かなくてブロックしっぱなしになる可能性があったそうです。そのためここでは RUBY_VM_CHECK_INTS_BLOCKING() で割り込みチェックだけして再試行すれば良いということにしているそうです。 EINTR で返ってきたということは割り込みを受けて処理が戻ってるのですぐに再試行してもいいはず、ということだと思います。

nagachika:r38556 2012-12-22 22:08:24 +0900

cont.c の rb_fiber_start() で同じ処理をしていた if の条件を1つにまとめるリファクタリングです。