ruby-trunk-changes r39590 - r39603

今日は rubygems の拡張ライブラリビルドの修正、Module#prepend に関連した修正、ObjectSpace.count_nodes の修正、Enumerator#with_index の修正などいろいろ不具合修正がありました。

nobu:r39590 2013-03-05 10:02:32 +0900

r39558 の rubygems の拡張ライブラリビルドの修正の続きですが、このコミットには ChangeLog のエントリ追加だけが書かれていて修正の本体はありません。 [Bug #7698]

svn:r39591 2013-03-05 10:02:36 +0900

version.h の日付更新。

nobu:r39592 2013-03-05 10:06:08 +0900

39590 の修正の本体。 r39558 の rubygems の拡張ライブラリビルドの修正の続きで、make での環境変数 DESTDIR の影響を除外するために一時的に環境変数 DESTDIR を削除しています。 [Bug #7698]

nobu:r39593 2013-03-05 10:18:55 +0900

Integer#succ と Integer#pred の実装で Bignum の時のショートカット(メソッド呼び出しを迂回して直接関数を呼ぶ)を追加して最適化しています。

nobu:r39594 2013-03-05 10:20:20 +0900

Enumerator#with_index には引数でオフセットを指定できるのですが、これに大きな数を指定するとオーバフローしてブロックに渡されるインデックスが負の数になっていた不具合を修正しています。 C の整数型で直接加算していたのを Ruby のオブジェクトとしてインデックスを保持して int_succ() を呼び出して加算処理するようにしています。 [ruby-dev:47131] [Bug #8010]
r39594 で追加修正されています。

nobu:r39595 2013-03-05 10:40:52 +0900

ObjectSpace.count_nodes という主に Ruby を parse した結果の AST のノードとして使われる NODE 構造体の数をカウントするメソッドで比較的新しいノードの対応が漏れていたのを追加しています。結果は NODE を表現する Symbol をキーとした Hash オブジェクトとして返されるのですが、不明な NODE として扱われるとキーが数値になっていました。 [ruby-core:53130] [Bug #8014]
なお追加されたノードは NODE_OP_CDECL, NODE_KW_ARG, NODE_CREF で 2.0.0 では既に追加済みです。 1.9.3 では NODE_OP_CDECL のみ存在しています。

drbrain:r39596 2013-03-05 12:25:55 +0900

r39594 での Enumerator#with_index の修正の再修正。インデックスの数値の初期化を消してしまっていたので nil の時に Fixnum の 0 に初期化するようにしています。 [ruby-dev:47131] [Bug #8010]

drbrain:r39597 2013-03-05 12:31:28 +0900

RubyGems のバージョンを 2.0.0 から 2.0.1 に更新しています。
そして 1.8 との互換性のための修正も含まれています。チケット番号の参照に #9698 と書かれているのですが、多分 [Bug #7698] の間違いではないかと思います。

nobu:r39598 2013-03-05 20:23:55 +0900

include/ruby/intern.h で関数マクロとして定義されている rb_check_arity() を inline 関数として再定義しています。 引数を複数回評価されないようにするとのこと。
ABI 互換性を壊しそうなのでこれはバックポートできないですねぇ。これに依存した修正が入ると大変そうです。

nobu:r39599 2013-03-05 20:29:27 +0900

r39224 で Module#prepend で上書きされたメソッドに対して Module#instance_method で UnboundMethod を取得する時に prepend の影響を無視して本来のメソッドを取得できるようにしたのを revert しています。 [ruby-core:53038] [Bug #7988] prepend されたメソッドの instance_method 等のメソッドでの取得は、respond_to? のように追加の引数でどちらを取得するのか選択できるようにするアプローチに変更されるようです。
ちなみに r39224 はまだ backport されていないのであわてなくていいですが、 revert といってもテストは完全に消さずに assert だけ変更しているのでやるなら 2つをまとめて backport するのが良さそうです(完全にメンテナ向けのコメントです)。 [ruby-core:52160] [Bug #7836]

nobu:r39600 2013-03-05 21:30:27 +0900

test/ruby/test_method.rb でメソッドエントリのマーク漏れの不具合に対するテストで、再現性が低いので何度も繰り返していたものの繰り返し回数を 1000 -> 100 に減らしています。 [ruby-core:43380] [Bug #6171]

nobu:r39601 2013-03-05 21:36:45 +0900

Fixnum の演算子メソッドを Module#prepend で上書きしても再定義フラグが立っていなくて VM での最適化が解除されず、prepend したメソッドが反映されないのを修正しています。 [ruby-dev:47124] [Bug #7983]

kazu:r39602 2013-03-05 21:50:58 +0900

r39579, r39592, r39598, r39601 の ChangeLog エントリの typo 修正。

nagachika:r39603 2013-03-05 22:48:20 +0900

r39597 の ChangeLog エントリのチケット番号を修正。