ruby-trunk-changes r53453 - r53467

今日はメモリ管理の構造体のサイズ削減や Enumerable#minmax, #min, #max などの最適化、C++ で書かれた拡張ライブラリのビルドエラーの修正などがありました。

usa: r53453 2016-01-07 21:28:32 +0900

r53452 の .eventids.check のルールの修正ですが、bsdmake だけでなく nmake でも問題になり、変数を使っても回避できないらしいのでそもそもファイル名を .eventids2-check と改名して拡張子のルールと誤解釈されないように修正しています。

shugo: r53454 2016-01-07 22:06:23 +0900

Array#sort で要素の比較を Fixnum と String の時にメソッド呼び出しによらず直接比較する最適化を行なっていたのと同様の最適化を Enumerable#minmax でも適用するようにしています。

mrkn: r53455 2016-01-07 22:35:32 +0900

include/ruby/ruby.h で C++ 向けのコンパイル時に HAVE_BUILTIN___BUILTIN_CHOOSE_EXPR_CONSTANT_P と HAVE_BUILTIN___BUILTIN_TYPES_COMPATIBLE_P を #undef しておくようにしています。 r43885 とか r47866 などでこの gcc 拡張を使ってランタイムの分岐を抑える最適化を使っていましたが、C++ ではこれらの拡張が使えないためヘッダで使っているところが C++ の拡張ライブラリのビルドでエラーになっていたようです。 [ruby-core:72736] [Bug #11962]

shugo: r53456 2016-01-08 00:07:25 +0900

r53454 と同様の要素の比較の Fixnum と String での最適化を Enumerable#min と Enumerable#max でも適用しています。

svn: r53457 2016-01-08 00:07:27 +0900

version.h の日付更新。

shugo: r53458 2016-01-08 09:38:40 +0900

iseq.c の rb_iseq_compile_with_option() にて関数全体のスコープで宣言されていた変数の一部を EXEC_TAG() の if 分岐内のブロックのスコープに移動しています。 setjmp(3) による未初期化変数の警告除去のためのようです。

shugo: r53459 2016-01-08 12:35:06 +0900

r53314 あたりの version.h の RUBY_VERSION の定義方法の変更に tool/make-snapshot を対応させています。 RUBY_VERSION というマクロの定義を抜き取るようにしてましたが、trunk (2.4) 以降は直接バージョンを書かなくなったので RUBY_API_VERSION_{MAJOR,MINOR,TEENY} の定義から抜き取る処理に fallback させるようにしています。 RUBY_VERSION の定義から抜けたらそっちを使うので、古いブランチに対して使った時はこれまでの処理が生きてくれるので trunk の tool/make-snapshot を安定版ブランチのリリースに使っても問題なさそうですね(ごく限られた人にしか関係ないことですが)。

nobu: r53460 2016-01-08 16:47:49 +0900

r53458 の rb_iseq_compile_with_option() の変数のスコープ変更を revert して、gcc 4.8 では(と思ったけど 4.8 以外でも同じですね)変数に volatile 修飾子を付けることで警告除去しようとしています。また iseq が作成されていなかった時の例外発生を EXEC_TAG() の state のチェックによる大域脱出の後にするようにしています。最後のはちょっと別件の不具合修正?

ko1: r53461 2016-01-08 17:23:58 +0900

struct heap_page の heap メンバを削ってかわりに flags に in_tomb というフラグを追加することで heap_page が tomb heap に所属していることを判定するようにしています。また total_slots, free_slots, final_slots などのメンバは上限が heap_page 内の slot 数までなので short で充分ということで型を変更してサイズを小さくしています。

svn: r53462 2016-01-08 17:23:59 +0900

r53461 の ChangeLog エントリの行末の空白除去。

nobu: r53463 2016-01-08 17:24:01 +0900

test/test_tempfile.rb の assertion にただの assert が使われていたところを test/lib/test/unit/assertions.rb で定義されている assert_file を利用するようにリファクタリング

ko1: r53464 2016-01-08 19:34:14 +0900

rb_heap_t::page_length を total_pages に構造体メンバ名を改名しています。 コメントに書かれているので明らかではありますが、heap 内の page の数を保持するメンバでしたが page のサイズを表しているみたいな名前でもあったので変更したということのようです。

nobu: r53465 2016-01-08 19:52:24 +0900

r53460 の rb_iseq_compile_with_option() で変数に volatile 修飾子をつける条件を少し変更して、gcc の 4.8 もしくは gcc 以外のコンパイラでは volatile をつけ、4.8 以外の gcc では volatile を付けないようにしています。

ko1: r53466 2016-01-08 19:56:27 +0900

struct heap_page::body というメンバを削除しています。 これはメモリ確保された heap page の本体のヘッダつきの先頭アドレスを指しているのですが、実際に slot をつめる先頭位置を保持する start からヘッダのぶん遡ることで取得可能なので、struct heap_page で直接保持していなくても後から計算可能ということでメモリ削減のため? 削除されています。

knu: r53467 2016-01-08 22:34:52 +0900

doc/regexp.rdoc の "\G" の説明を追記しています。これは String#gsub や String#scan など同じ正規表現を繰り返しマッチさせるメソッドで、先頭から連続した部分にだけマッチするように先頭or前回のマッチした部分の次を指す特殊な位置指定です。