ruby-trunk-changes r44125 - r44139

今日は Float#/ の再定義がきかない不具合修正や raise での例外発生時の TracePoint イベントフック実行順序の修正、[]= メソッドの最適化命令の有効化、Hash#reject の仕様変更(dup + reject! じゃなくなった)などなど見所がたくさんありました。

nobu:r44125 2013-12-10 23:44:51 +0900

空の配列や空の Hash と false が hash メソッドで同じ値を返していたので Array#hash と Hash#hash で最初に関数ポインタを salt として加えて結果が異なるようにしています。 [ruby-core:58993] [Bug #9231]

nobu:r44126 2013-12-10 23:58:43 +0900

r44086 で ext/date/date_parse.c の時刻パース用の正規表現のバックトラック抑制のための変更を行なったのと同じ正規表現が date_strptime.c にも存在していたので、こちらも同じく修正しています。 [ruby-core:58984] [Bug #9221]

marcandre:r44127 2013-12-11 03:18:31 +0900

Float#/ を再定義しても VM の最適化が効いていて Float#* を再定義しないと再定義されたメソッドのほうが呼ばれない不具合を修正しています。 [ruby-core:59027] [Bug #9238]

svn:r44128 2013-12-11 03:18:51 +0900

version.h の日付更新。

drbrain:r44129 2013-12-11 04:54:19 +0900

RubyGems の最新版をマージしています。 メソッド名の互換性のための改名(extension_install_dir → extension_dir)、gem.deps.rb.lock ファイルの生成の不具合修正などが含まれているそうです。

nobu:r44130 2013-12-11 10:48:17 +0900

test/ruby/envutil.rb の assert_separately で子プロセスの例外発生時に Exception#backtrace が nil のままの場合があるので nil チェックしておくようにしています。sigaltstack が使用できない環境でマシンスタックがオーバフローして SystemStackError が発生する時にバックトレースが取得できないことがあるそうです。

hsbt:r44131 2013-12-11 12:10:54 +0900

拡張ライブラリ racc に同梱されている cparse の ext/racc/cparse/README ファイルにも RAA へのリンクが含まれていたので http://i.loveruby.net/en/projects/racchttps://github.com/tenderlove/racc で置き換えています。

hsbt:r44132 2013-12-11 12:36:03 +0900

ext/tk/lib/tkextlib/SUPPORT_STATUS からも RAA へのリンクを削除しています。

ko1:r44133 2013-12-11 12:39:52 +0900

例外発生時に例外オブジェクトを生成するのを control frame を pop する前に生成しておくようにすることで set_trace_func や TracePoint で例外発生のイベントが raise メソッドの開始 → 例外発生 → raise メソッドの終了の順になるように修正しています。これまでは raise メソッド開始 → メソッド終了 → 例外発生 という順序になっていたようです。 [ruby-core:57109] [Bug #8886]

a_matsuda:r44134 2013-12-11 12:58:07 +0900

win32ole のインスタンス変数名、openssl と webrick の rdoc 用コメントおよび template/yarvarch.ja で recieve → receive の typo 修正。

nobu:r44135 2013-12-11 13:01:06 +0900

template/yarvarch.ja の行末の空白除去。

tmm1:r44136 2013-12-11 15:38:42 +0900

RubyVm には [ ]= メソッドの Array#[ ]= と Hash#[ ]= 用の最適化命令 opt_aset が存在しているのですが、利用されていなかったので、コンパイル時に [ ]= メソッドは opt_aset を利用するように修正しています。 [ruby-core:58956] [Bug #9227]

nobu:r44137 2013-12-11 16:01:29 +0900

Hash#reject が返す Enumerator の size の不具合修正 r44047 で Hash#reject が元の Hash のインスタンス変数や default 値などを複製しなくなっていたのですが、Hash#reject は元の Hash をコピーしないという仕様に変更しています。 [ruby-core:59045] [Bug #9223]
うーんしかし Hash#reject == dup + reject! というのはドキュメントにも記述されていた仕様で、おそらくかなり昔からこの挙動をしていたと思うので 2.1 直前でこの仕様変更してしまうのは危ないんではないでしょうか。

ko1:r44138 2013-12-11 16:41:14 +0900

r44133 の例外発生時の control frame の pop と例外オブジェクト生成の順番の入れかえを revert しています。 [Bug #8886] に理由が書いてあるということですが、例外オブジェクトを raise の frame で生成するとその backtrace に raise メソッドが含まれてしまうためだそうです。例外が raise メソッドで発生したことになる(ある意味それは正しいわけですが、それだと嬉しくないので呼び元の情報が入るほうがいい)ので、やはり control frame を pop してから例外を生成するようにしています。

ko1:r44139 2013-12-11 16:53:16 +0900

r44138 で raise メソッドでの例外発生時の control frame を呼び元に戻したのですが、RUBY_EVENT_C_RETURN のフック実行を例外生成前に移動することで元のチケットの TracePoint のイベントの順序については対応したようです。今度は Exception#backtrace の呼び出し(例外生成時に呼ばれている模様)が raise の外側になってしまうという minor change がありますが。 [ruby-core:57109] [Bug #8886]