ruby-trunk-changes r43738 - r43765

今日は RubyWorld Conference があり Conference Driven Development 効果でたくさんコミットがありました。
full GC のトリガに旧世代のオブジェクトのメモリ使用量を考慮するようにする機能がデフォルトで有効になり、そのパラメータ調整のための環境変数が導入されました。また Delegator が private なメソッドを転送するしくみの再修正がありました。 BidDecimal#sqrt の精度の不具合修正がありました。

zzak:r43738 2013-11-21 10:31:51 +0900

拡張ライブラリ digest のテストに Digest::SHA256.bubblebabble というダイジェスト方法のメソッドのテストがなかったので追加しています。

svn:r43739 2013-11-21 10:31:59 +0900

version.h の日付更新。

zzak:r43740 2013-11-21 10:46:48 +0900

拡張ライブラリ openssl に添付されている OpenSSL::Buffering の initialize が *args で引数を受け取っていたのを使用していない引数なので削除しています。 https://github.com/ruby/ruby/pull/445
けど OpenSSL::Buffering は Module なので、initialize で任意の引数を受け付けることができるようにしておくのは一種のイディオムなんじゃないかなと思います。 test-all は通ってるので大丈夫みたいですけど。ちょっと調べてみると OpenSSL::SSL::SSLSocket は OpenSSL::Buffering を include していますが、OpenSSL::SSL::SSLSocket#initialize は任意の個数の引数を受け取って rb_call_super(0, 0) で受け取った引数を渡さずに super を呼んでいる(Ruby で書くと super() と書いたのと同等)なので、 include されている Module には引数なしの initialize が呼ばれているので大丈夫だったようです。同じく include されている OpenSSL::SSL::Nonblock は initialize に任意の個数の引数を受け取った上で super (かっこなし)でその引数をそのまま ancestors のメソッドに渡すようにしているので、お作法としてはこれと同じにしておくのがいいのではないかなと思います。

zzak:r43742 2013-11-21 13:37:14 +0900

拡張ライブラリ openssl の OpenSSL::Engine の rdoc コメントを追記しています。 https://github.com/ruby/ruby/pull/436

zzak:r43743 2013-11-21 13:44:45 +0900

標準添付ライブラリ observer.rb の rdoc コメントで Observable の使いかたについてより細かく記述するようにしています。 https://github.com/ruby/ruby/pull/450

ko1:r43744 2013-11-21 13:57:37 +0900

RGenGC の RGENGC_CHECK_MODE >= 2 の時のチェック内容をがっつり変更しているようです。あまり変更前と比較して読んでいませんが、オブジェクトの参照ツリー構造を構築して、Write Barrier が正しく機能していて、old なオブジェクトから参照されているオブジェクトが remember set に入っているかとかマークされるべきオブジェクトが全てマークされているかとかチェックするようにしているそうです。is_mark_stask_empty() は is_mark_stack_empty() の typo かな?

nobu:r43745 2013-11-21 14:01:05 +0900

r43744 の行末の空白除去。

ko1:r43746 2013-11-21 14:07:04 +0900

r43745 の追加修正。出力メッセージの fprintf(3) のフォーマットの指示子が不足していたのと、gc_marks_check() で全オブジェクトの参照情報をダンプしていたのをやめています。

zzak:r43747 2013-11-21 14:19:32 +0900

Object#dup の rdoc コメントで dup と clone の違いについて "on dup vs clone" という節を設けてサンプルを交えてより具体的に記述するようにしています。 [ruby-core:58435] [Bug #9128]

usa:r43748 2013-11-21 15:33:41 +0900

Windows でマシンスタックのオーバフローの検出のために SAVE_ROOT_JMPBUF() の文の前後をブロックで囲んで __try と __except という VC のコンパイラ拡張の記法(?)でかこんで、例外が発生した時に対応できるようにしているそうです。ただ mingw-gcc では __try/__except がサポートされていないことなど制限もあるみたいで、 Windows でのスタックオーバフロー検出はなかなか難しい状況だそうです。

zzak:r43749 2013-11-21 15:35:25 +0900

r43742 の ChangeLog エントリに Github の pull request の URL を追記しています。

zzak:r43750 2013-11-21 15:37:20 +0900

OpenSSL::Buffering の rdoc コメントで =begin ... =end の複数行コメントを利用していると RDoc がその後のコメントをうまくパースできないらしくて体裁がおかしくなってしまうので =begin ... =end の部分をヒアドキュメントに置き換えています。

knu:r43751 2013-11-21 16:26:53 +0900

標準ライブラリ URI のテストで 文字列と URI の加算 (URI#+ メソッド)のテストに文字列を渡したケースをテストしていたのを URI を渡したケースもテストするようにしています。

nobu:r43752 2013-11-21 16:33:01 +0900

r43682, r43727 での Delegator の修正を revert して method_missing で private なメソッドの起動にも対応するようにすることで send も呼べるようにしています。 また Kernel で定義されているメソッドも転送できるように Delegator では private なメソッドの定義は undef するようにしています。ただし block_given? と iterator? は呼び元で評価されないと意図した動きにならないので消さないようにしています。 https://github.com/ruby/ruby/pull/449

zzak:r43753 2013-11-21 16:51:29 +0900

r43738 に続いて拡張ライブラリ digest の bubblebabble のテストを追加しています。 Digest の特異メソッドと Digest::XXX のインスタンスメソッドとしても呼べるので追加しています。

zzak:r43754 2013-11-21 16:53:39 +0900

Digest::Class の bubblebabble メソッドの rdoc コメントが rb_path2class("Digest::Class") でクラスを取得して定義しているために RDoc がクラスを認識してくれないので、コメントアウトした状態で rb_define_class() を書いて RDoc にクラス名がわかるようにしています。

ko1:r43755 2013-11-21 17:20:34 +0900

r43532 で導入した RGenGC の旧世代のオブジェクトのメモリ消費量を major GC のトリガとして利用するようにする RGENGC_ESTIMATE_OLDSPACE のデフォルトを 1 にしてデフォルトで有効になるように変更しています。またいくつかパラメータを調整して、環境変数(RUBY_GC_HEAP_OLDSPACE/RUBY_GC_HEAP_OLDSPACE_MAX/RUBY_GC_HEAP_OLDSPACE_GROWTH_FACTOR)で値を調整できるようにする機能を導入しているようです。

nobu:r43756 2013-11-21 17:21:05 +0900

r43755 の行末の空白を削除しています。

ko1:r43757 2013-11-21 17:50:40 +0900

GC のパラメータの指定に使う変数を initial_xxx から 構造体 gc_params のメンバにまとめるリファクタリングです。必ずしも初期化時のみに利用するわけではないので initial_xxx という名称は妥当ではなかったようです。
またコミットログで RubyPrize のお祝いをいただきました。ありがとうございます!

nobu:r43758 2013-11-21 18:28:43 +0900

標準ライブラリ tempfile の Tempfile#initialize で $VERBOSE が真の時の警告が出るのを抑制するために create メソッドを Dir::Tmpname のクラスメソッドを呼ぶように変更しています。

nobu:r43759 2013-11-21 18:47:31 +0900

標準添付ライブラリ delegate で r43752 で導入した private メソッドを転送するようにする変更で raise も undef してしまっていたので、 raise を __raise__ として alias した上で __raise__ は undef しないようにして __raise__ を使って例外を発生させるようにしています。

nobu:r43760 2013-11-21 18:49:05 +0900

malloc_usable_size(3) というライブラリ関数があるそうで、これが利用可能な場合はこれを使って確保済みのメモリ領域のサイズを取得して gc.c のメモリ管理のヒントに利用するようにしているみたいです。こんな関数があるの知りませんでした。

nobu:r43761 2013-11-21 18:51:18 +0900

Tempfile のテストで未使用のローカル変数の削除など警告の除去を行なっています。

nobu:r43762 2013-11-21 18:52:09 +0900

Windows 環境で malloc_usable_size(3) の代替として _msize() を利用するようにマクロ定義を追加しています。

nobu:r43763 2013-11-21 20:41:16 +0900

gc.c で malloc_usable_size(3) が利用できるように malloc.h を #include しています。

mrkn:r43764 2013-11-21 21:37:46 +0900

拡張ライブラリ bigdecimalBigDecimal#sqrt が指定された精度が出ていなかった不具合を修正しています。 [Bug #5266] [ruby-dev:44450]

mrkn:r43765 2013-11-21 21:42:01 +0900

拡張ライブラリ bigdecimal でメモリ確保の関数 VpAlloc() で必要な精度のぶんバッファを用意するのに切り上げの計算が常に1ワードぶん余分に確保してしまっていたので +1 するのは mx が 0 になってしまった時だけにしています。