ruby-trunk-changes r42813 - r42836

今日はまずメソッドキャッシュの破棄を効率的にした hierarchy method cache invalidation の導入がありました。これでメソッドを動的に定義し続けたり一時的なオブジェクトに extend したりするのが効率的になるかもしれません。また Bignum の内部的 API の追加や String#gsub の正規表現で '\K' を使った時の不具合修正などがありました。

kou:r42813 2013-09-03 22:57:18 +0900

標準添付ライブラリ rexml の REXML::Parsers::TreeParser#parse で不正な XML をパースすると例外のメッセージが何度も同じものが表示されるのを修正しています。 [ruby-dev:47672] [Bug #8844]

kou:r42814 2013-09-03 22:58:24 +0900

rexml のテストのテストメソッド名を改名しています。

kou:r42815 2013-09-03 23:01:20 +0900

標準添付ライブラリ rexml で対応する閉じタグのない XML をパースした時の ParseException で問題のあった XML 上の行数などを表示するようにしています。 [ruby-dev:47672] [Bug #8844]

kou:r42816 2013-09-03 23:02:10 +0900

r42813 のテストで例外メッセージの内容で XML の問題のあった位置をテストデータから計算するようにしています。

nobu:r42817 2013-09-04 11:11:38 +0900

Bignum に GMP を使うようになった関連で configure で SOLIBS に -lgmp を追加するようにしています。コミットログには non-ELF なプラットフォームで test-all の worker が動くように、とあるのですが test-all に限定した問題があったのでしょうか。よくわかりませんでした。

svn:r42818 2013-09-04 11:11:43 +0900

version.h の日付更新。

nobu:r42819 2013-09-04 11:12:39 +0900

昨日の r42800 で rb_bug() のメッセージに含まれる不具合報告用の URL の変更をして、r42802 でテストを追随して変更してから r42803 で r42800 だけ revert したためテストが失敗する状態になっていたので、テストはどっちでも動くように緩くチェックするように変更しています。

nobu:r42820 2013-09-04 11:13:42 +0900

String#gsub で正規表現の "\K" (後読みの指定)が動作していなかった不具合を修正しています。 [ruby-dev:47694] [Bug #8856]

kazu:r42821 2013-09-04 13:19:28 +0900

r42785 と r42788 の ChangeLog エントリの typo 修正。

charliesome:r42822 2013-09-04 14:25:06 +0900

メソッドッキャッシュの無効化をクラスの継承関係などを元にした hierarchy method cache invalidation というのを実装しています。これまでメソッドキャッシュはメソッド定義をしたりメソッドを持つ Class/Module が GC で回収されるなどの時に VM が持つバージョンというのをインクリメントして、これが更新されると全体でメソッドキャッシュが無効化されて再取得するようになっていたため、無名モジュールを使い捨てていたり一時的なオブジェクトに Module を extend して使ったり(特異クラスが発生する)とメタプログラミングを多用していると頻繁にメソッドキャッシュのクリアが発生して遅くなっていたのが、その影響が限定的になるかもしれません。良く実装をみてないのでどういう範囲でクリアされるようになるのかよくわかってませんけど。しかしこれはとても魅力的な変更ですね。実用的なアプリケーションでどのくらい影響があるんでしょうか。 [ruby-core:55053] [Feature #8426]

naruse:r42823 2013-09-04 15:40:39 +0900

r42789 で新しい Mac OS X の仕様に対応した UTF8-MAC の変換テーブルの追加修正をしています。 [ruby-dev:47680]

a_matsuda:r42824 2013-09-04 15:43:05 +0900

NEWS ファイルに昨日の r42809 で Module#include と Module#prepend を public メソッドにした変更について追記しています。 [Feature #8846]

nobu:r42825 2013-09-04 16:18:24 +0900

vm.c のコーディングスタイルの修正のみ。r42822 の追加修正ですね。

nobu:r42826 2013-09-04 16:28:28 +0900

これも r42822 の追加修正だろうと思いますが vm_state_version_t の型を uint64_t か unsigned LONG_LONG にするかはどっちか大きいほうを優先するようにしています。

nobu:r42827 2013-09-04 19:18:47 +0900

r42822 および r42826 のさらに追加で、やっぱり LONG_LONG を uint64_t より優先するようにしています。

akr:r42828 2013-09-04 20:23:05 +0900

bignum.c の bigdivrem_normal() に引数のチェックを行う assert() を追加しています。

nobu:r42829 2013-09-04 22:57:02 +0900

numeric.c の Numeric#step の引数解析で使う関数マクロ NUM_STEP_SCAN_ARGS() を最後の引数 inf が Float の時に実施する分岐部分だけ NUM_STEP_GET_INF() という別の関数マクロとして分岐して必要に応じて呼び元で呼ぶようにリファクタリングしています。

akr:r42830 2013-09-04 23:03:29 +0900

bignum.c で既に存在しない関数 bigdivrem() の prototype 宣言のみ残っていたので削除しています。

nobu:r42831 2013-09-04 23:41:38 +0900

win32/win32/c の do_select() で struct timeval の型に const が付いていて select() の宣言の型と異なっていたためコンパイラの警告が出ていたのを抑制するため const を消しています。

akr:r42832 2013-09-05 00:10:48 +0900

bignum.c の bigdivrem_normal() を引数に商と余剰を返す BDIGIT 配列を両方受け取るようにして bary_divmod_normal() として再定義して bary_divmod() と bigdivrem() でこちらを使うように改造して不要な一時バッファの利用を抑制しています。

svn:r42833 2013-09-05 00:10:55 +0900

version.h の日付更新。

akr:r42834 2013-09-05 01:10:06 +0900

ruby 内部で使うための rb_big_divrem_normal() という関数を追加しています。 bary_divmod_normal() の wrapper で Bignum 同士の除算の商と余剰を取得する関数ですね。

nobu:r42835 2013-09-05 01:11:22 +0900

r42834 で新規追加したファイルの svn property 設定。

charliesome:r42836 2013-09-05 01:53:20 +0900

r42822 の追加修正で inline method cache のヒットのチェックで callinfo::klass のチェックは不要として削除しています。メソッドキャッシュの変更時に Class/Module 毎に連番を振って更新を管理するようにしてみたいなのですが、コミットメッセージから判断するとどうもこの連番は VM 全体で一意になるように採番しているようなので、このチェックだけで充分ということみたいです。オーバフローは考慮しなくていいのかな。まあそれを言い出すと klass までチェックしても完璧ではないでしょうけど。