ruby-trunk-changes r44151 - r44180

今日は bigdecimal の不具合修正、RubyGems の更新、RGenGC の shady という語彙をやめるための改名、Exception#backtrace_locations の追加、include/prepend と alias を組み合わせた時の不具合修正などたくさん変更がありました。

mrkn:r44151 2013-12-13 02:02:20 +0900

拡張ライブラリ bigdecimalデバッグ用(おそらく)表示関数 VPrint() を公開 しない static 関数に変更しています。また表示内容も詳細にしているようです。

mrkn:r44152 2013-12-13 02:02:24 +0900

拡張ライブラリ bigdecimal の VpAddAbs() と VpSubAbs() でループ内で不変の条件による分岐を while ループの外に出すリファクタリング

mrkn:r44153 2013-12-13 02:02:27 +0900

拡張ライブラリ bigdecimalBigDecimal.limit の値によって計算結果が不正になることがあった不具合を修正しています。 VpSetPTR() で BigDecimal.limit の精度を考慮するようにしているようですがよくわかりません。 [ruby-core:50269] [Bug #7458]

mrkn さんに教えていただきました

svn:r44154 2013-12-13 02:02:27 +0900

version.h の日付更新。

mrkn:r44155 2013-12-13 02:08:26 +0900

r44154 の ChangeLog エントリに ML とチケット番号を追記しています。

tmm1:r44156 2013-12-13 08:19:02 +0900

r43973 で RClass のメソッドテーブルを Module と IClass で共有できるようにした時に RCLASS_M_TBL_WRAPPER() だけ比較すればいいのに RCLASS_M_TBL() を比較しているままだった部分が Module#include や is_kind_of?、Module#<=> などの実装で残っていてかえって遅くなっていたので追加修正しています。

drbrain:r44157 2013-12-13 09:51:04 +0900

RubyGems を更新しています。 gem cache ファイルの読み書きに flock でロックをかけるようにしたり、拡張ライブラリのインストール先ディレクトリをパッケージの指定で変更できるようにしたりといった変更があったようです。
gem cache ファイルのロック理由として thread safety の為って書いてあるけど flock(2) ってプロセス毎なんじゃ……と思いましたが、同じファイルを別の file descriptor で開いてれば別々にロック取得できそうですから、多分そういうことなのでしょう。同じ IO オブジェクトを複数 Thread で触るならまあアプリ側で排他したほうがいいでしょうしね。別の IO オブジェクトで fd が同じという可能性も……まあいいか。

nobu:r44158 2013-12-13 09:56:06 +0900

lib/rubygems.rb の行末の空白除去。

drbrain:r44159 2013-12-13 10:04:36 +0900

RubyGems を再度更新。 Gem::RequestSet::Lockfile#peek がファイル終端にきたときに :EOF を返していたのを [:EOF] を返すようにしています。よくわかりませんが 1.8.7 との互換性のためらしいです。

nobu:r44160 2013-12-13 10:36:29 +0900

.gdbinit でデバッグ用の enum の読み込みを rp で実行していたのを ruby_gdb_init というコマンドに移動しています。また rb_id2name でもこの初期化コマンドを呼び出すようにしています。

nobu:r44161 2013-12-13 10:36:31 +0900

Method#inspect の実装で data->me->klass の参照を辿るのを毎回書かずにローカル変数に格納しておいてこれを使うようにするリファクタリング

a_matsuda:r44162 2013-12-13 11:21:09 +0900

doc/contributing.rdoc の typo 修正。 propoasl → proposal https://github.com/ruby/ruby/pull/476

ko1:r44163 2013-12-13 11:38:05 +0900

RGenGC の Shady という語彙をやめようとしているようで、まず RVALUE_RAW_SHADY() と RVALUE_SHADY() というマクロを RVALUE_WB_PROTECTED_RAW() と RVALUE_WB_PROTECTED() に変更しています。ただしこれらのマクロは意味が反転していて RVALUE_SHADY() == !(RVALUE_WB_PROTECTED()) という関係になってます。 また rgengc_check_shady() も rgengc_check_relation() と改名しています。

a_matsuda:r44164 2013-12-13 11:38:55 +0900

標準添付ライブラリ net/pop の rdoc コメントの typo 修正。 deguging → debugging

ko1:r44165 2013-12-13 11:53:27 +0900

array.c と variable.c のコメントでも shady という語彙を non-WB-protected と言いかえています。

ko1:r44166 2013-12-13 12:02:03 +0900

gc.c の gc_prof_timer_start() で GC 中に呼ばれたら assert(3) で異常終了させていたのを rb_bug() を呼ぶように変更しています。 [ruby-core:58886] [Bug #9222]

nobu:r44167 2013-12-13 12:23:42 +0900

メソッドキャッシュを無効化する rb_clear_method_cache_by_class() がメソッドエントリを作る rb_method_entry_make() で呼ばれているので、呼び元のあちこちで呼んでいるのは重複しているので削除しています。一箇所だけ既に存在するメソッドエントリの可視性を変更しているところは逆にメソッドキャッシュクリアを追加しています。

nobu:r44168 2013-12-13 12:53:18 +0900

eval.c のインデント修正のみ。

nobu:r44169 2013-12-13 12:53:20 +0900

eval.c では main.using および Module#using によるメソッドキャッシュのクリアをそれぞれの実装関数から共通部分の rb_using_module() の中で呼ぶようにまとめています。

ko1:r44170 2013-12-13 13:31:06 +0900

Exception#backtrace_locations というメソッドを追加しています。これは backtrace と同様に例外発生位置を返しますが、文字列ではなく Thread::Backtrace::Location オブジェクトで各フレームの情報を表現するものです。 [ruby-core:57430] [Feature #8960]

tmm1:r44171 2013-12-13 16:30:33 +0900

GC.latest_gc_info の GC 理由の検出で複数のビットフラグが混在しうる時に :nofree (空きスロットがなかった)の優先順位を下げて他の理由があったらそれを返すようにしています。

nobu:r44172 2013-12-13 18:17:55 +0900

標準添付ライブラリ test/unit の Test::Unit::Assersions#assert_raise_with_message で expected に正規表現が渡された時にブロック内の $~ を assert_raise_with_message での例外メッセージのマッチの結果を格納するようにしています。うーんこれはなぜでしょう……。

nobu:r44173 2013-12-13 18:18:05 +0900

テストで assert を使っていたところをよりわかりやすいメッセージが出るように assert_equal, assert_not_equal, assert_include, assert_predicate 等々適当な assertion を使うようにしたり、メッセージを追加したりしています。

nobu:r44174 2013-12-13 22:29:07 +0900

WeakMap#include? のテストで参照先のオブジェクトをローカル変数に入れていたのを Object.new のブロック内のブロックパラメータとして持たせるように……って Object.new はブロックを呼び出さないみたいですけど。これブロックの中が実行されなくなっているんじゃないでしょうか。

nobu:r44175 2013-12-13 22:29:23 +0900

Method#owner が include/prepend と alias が組み合わされた時に alias が定義されたクラスを返すように修正しています。 [ruby-core:52206] [Bug #7842] この影響で prepend+alias でメソッド呼び出しの順番がスキップされたり([ruby-core:53070] [Bug #7993])、 include と alias で alias したメソッドを呼ぶメソッドを定義した Module を include して呼ぶと無限再帰が発生する不具合などがあったようです([ruby-dev:47846] [Bug #9236])。

nobu:r44176 2013-12-13 23:03:48 +0900

r44174 のテストの修正で Object.new にブロックを渡していたのは tap メソッドの呼び出しが抜けていたようです。多分ブロックパラメータにすることで GC で回収されやすくしているのかなぁと思います。

nobu:r44177 2013-12-13 23:20:53 +0900

test/ruby/test_pack.rb でも assert を assert_prediate に置き換えるテストのリファクタリング

nobu:r44178 2013-12-13 23:50:00 +0900

r44174 および r44176 の WeakMap#include? のテストの修正ふたたび。Object#tap でブロックパラメータを使うのではなくて 1.times do ... end のブロック内の dynamic variable として WeakMap の参照先を保持するようにしています。このほうがより回収されやすいみたいです。 VM のスタック上のより上のほうにのるからかな。けど nil でクリアしていれば(元々のコード)ローカル変数でも回収されそうですけどねぇ。

nobu:r44179 2013-12-14 00:18:12 +0900

r44175 の再修正。 Method#owner でその Method オブジェクトを作った元のクラスではなくそのメソッドが定義されているクラスを返すように defined_class を参照するようにしています。 またメソッドエントリ作成時にメソッドが IClass に所属する時は defined_class にその元の Module を格納しておくようにしています。

svn:r44180 2013-12-14 00:18:20 +0900

version.h の日付更新。