ruby-trunk-changes r45555 - r45569

今日はの Array の共有配列(shared array)を RGenGC の Write Barrier 保護するようにする変更や、Module のメソッド内で UnboundMethod#bind によるメソッド呼び出し内での super がエラーになっていた不具合の修正などがありました。

knu: r45555 2014-04-10 23:46:37 +0900

標準添付ライブラリ net/ftp の Net::FTP#login の rdoc 用コメントで anonymous アカウントでパスワードが指定されなかった時に使うデフォルトのパスワード(そんなものがあるのか…)を現在の実装の "anonymous@" に修正しています。

knu: r45556 2014-04-10 23:46:39 +0900

r45555 の ChangeLog に [DOC] タグを追記しています。

nobu: r45557 2014-04-11 10:31:00 +0900

make test-all のユーティリティ test/ruby/envutil.rb で invoke_ruby のキーワード引数に stdout_filter, stderr_filter を追加して call メソッドで標準出力/標準エラー出力を加工できるようにしています。

nobu: r45558 2014-04-11 10:31:03 +0900

r45553 の Array の実装での shared array の remember set 追加のテストを Timeout を利用せずに決まった回数ループをまわすように変更したり、GC.verify_internal_consistency の出力を削るようにしています。 r45557 で導入された invoke_ruby の stdout_filter キーワード引数を早速利用しています。

svn: r45559 2014-04-11 10:31:05 +0900

version.h の日付更新。

nobu: r45560 2014-04-11 10:31:06 +0900

gc.c の RGenGC チェック用の rb_bug() でメッセージに不要な改行を含めていたのを削っています。改行は自動的に追加されるので引数に渡す文字列には不要でした。

nobu: r45561 2014-04-11 10:49:04 +0900

r45558 のテストの変更で出力を削るために GC.verify_internal_consistency の前に手動で minor GC を実行して出力を減らしているそうです。また正規表現を修正して削る対象を増やしているみたいです。

nobu: r45562 2014-04-11 12:44:52 +0900

Array#reject の中で callcc で Continuation を作成して reject を抜けた後で再入すると SEGV する不具合を修正しています。 ary_reject() で rb_ary_push_1() という関数を利用していたのを rb_ary_push() を利用するようにしています。 rb_ary_push() と rb_ary_push_1() は capa が足りない時に拡張する方法だけが違っていて、配列が shared array の場合の考慮がないものだったので考慮する版を使うようにしています。 なんで rb_ary_push_1() の実装がぽつんと残ってたんでしょうね。 [ruby-dev:48101] [Bug #9727]

naruse: r45563 2014-04-11 13:48:26 +0900

addr2line.c の C level backtrace 取得の実装で、lines の処理済みのフレームのところの行番号に -1 や -2 を入れておくのをやめて dladdr(3) を使って base address を取得することで処理済みのところをスキップするようにしているそうです。もうこのへんよく理解してないです。

nobu: r45564 2014-04-11 14:40:52 +0900

メソッドサーチで super を不正なコンテキストで(条件が複雑なので詳細は割愛)呼ばれた時に発生する TypeError のメッセージにクラス名を埋め込む時に PRIsVALUE を利用してエンコーディングを保持するようにしています。

nobu: r45565 2014-04-11 15:05:28 +0900

2つの Module A, B で同名のメソッドを定義して B のほうでは super を呼んでいて、しかも B で Module#instance_method で UnboundMethod として取り出した上で同名のメソッドを再定義してその中で UnboundMethod を再度 bind して呼び出す、なんていうなんでそんなことがしたいのか理解に苦しむコードで super が TypeError を発生させていたのを修正しています。 UnboundMethod を bind して呼ぶとメソッド探索時に定義クラスを IClass にして、その時も super を呼べるようにしています。 [ruby-core:61936] [Bug #9721]
r45564 はこの修正に絡んで例外メッセージにクラス名を埋め込んでいるところをみつけたんでしょうね。

nobu: r45566 2014-04-11 15:17:17 +0900

r45553 のテストを r45558 でタイムアウトから固定回数のループに変更したのに追随してタイムアウトを 5秒からデフォルトの10秒に延ばしています。

nobu: r45567 2014-04-11 15:53:28 +0900

r45566 のさらに続きで、タイムアウトしても失敗にはせず skip 扱いにするようにしています。またループ回数も調整しています。

ko1: r45568 2014-04-11 17:47:00 +0900

配列の RGenGC の shared array を Write Barrier で保護するようにしています。 これまでバッファを共有するために作られる shared array は、自分を参照している Array オブジェクトからもそのバッファにアクセスされるため shady 扱いしなくてはいけませんでしたが、ary_ensure_room_for_push()/ary_ensure_room_for_unshift() で shared array を作成する時は shared array オブジェクトを返すことで Write Barrier 保護つきのアクセスをするようにしています。これらの関数は思ってたのと違うオブジェクトが返ってくることがあるので注意深く利用しないといけなさそうですね。
また rb_mem_clear(), ary_mem_clear(), memfill(), ary_memfill(), ary_memcpy() などの関数の定義位置を移動しています。

ko1: r45569 2014-04-11 18:55:10 +0900

array.c に ARY_SET() というマクロを追加して RARRAY_ASET() + shared array でないかのチェック(assert())をするようにしています。 r45568 の影響を検証するための(多分一時的な)デバッグコードだと思います。