ruby-trunk-changes r55109 - r55119

今日は rb_scan_args() の一部環境でのマクロ化による最適化と、drb の DRb::TimerIdConv::TimerHolder2 の定期実行に finalizer を使う方法の追加などがありました。

nobu: r55109 2016-05-22 11:28:03 +0900

test/ruby/test_integer_comb.rb と test/ruby/test_optimization.rb から重複した assertion を削除して Fixnum と Bignum のチェックについては test/-ext-/integer/test_integer.rb に移動しています。

naruse: r55110 2016-05-22 11:44:54 +0900

rb_scan_args() をマクロ化して rb_scan_args0() という inline 関数に引数を配列にして渡すようにしています。 r55102 のリベンジですね。今度は arg0 を作るのに sizeof() を使って配列サイズを計算するようにしています。またマクロの定義は gcc で __OPTIMIZE__ が定義されている時だけ行うようにしています。

naruse: r55111 2016-05-22 12:31:22 +0900

r55110 の rb_scan_args() をマクロで再定義する条件を gcc の時ではなく HAVE_BUILTIN___BUILTIN_CHOOSE_EXPR_CONSTANT_P が定義されている時にして、__builtin_constant_p() と __builtin_choose_expr() を使って fmt が定数(リテラル)の時にのみ rb_scan_args0() を利用するようにしています。

duerst: r55112 2016-05-22 14:45:45 +0900

rergenc.c に onigenc_not_support_case_map() というエラーメッセージを出力する関数を追加しています。

duerst: r55113 2016-05-22 14:57:44 +0900

OnigEncodingType に case mapping 用のコールバック関数ポインタのメンバ case_map を追加して、r55112 で追加した onigenc_not_support_case_map() を unicode 系以外の各種 encoding の OnigEncodingDefine() の定義に追加しています。 unicode 系のエンコーディングでは onigenc_unicode_case_map をセットしています。

nobu: r55114 2016-05-22 16:27:02 +0900

test/unit/assertions.rb から assert_fixnum と assert_bignum を拡張ライブラリを使ったテスト test/lib/-test-/integer.rb に移動しています。 Fixnum と Bignum の区別は実装の詳細であり拡張ライブラリを使って判定する必要ができたので。 [ruby-core:75647] [Bug #12408]

nobu: r55115 2016-05-22 17:06:57 +0900

transcode.c の GC のための最適化避けに変数に volatile 修飾子をつけていたのを RB_GC_GUARD() を使うように修正しています。 [ruby-core:75664] [Bug #12411]

duerst: r55116 2016-05-22 17:24:08 +0900

テストのファイル test/ruby/enc/test_casing_options.rb を test/ruby/enc/test_case_options.rb に改名しています。

duerst: r55117 2016-05-22 17:25:18 +0900

r55116 のファイル名の変更にあわせてテストクラス名も変更しています。

seki: r55118 2016-05-22 20:03:43 +0900

r55008 で 標準添付ライブラリ drb の DRb::TimerIdConv::TimerHolder2 で Thread を起動しないようにしていましたが、add や fetch を呼んだ時だけ expire のチェックをするようにしていたのを、ObjectSpace.define_finalizer を使って適当なオブジェクトを作ってそれが GC されるときに DRb::TimerIdConv::TimerHolder2#on_gc を呼ばせて、その中で rotate を呼ぶ Thread を起動する(終わると停止する)ようにしてある程度定期的に実行されるようにしています。 Thread 起動しているのは Mutex を使っているので。 参考 URL: http://d.hatena.ne.jp/m_seki/20160521#1463801531
CRuby の GC は保守的なので、一度作った Object のアドレスと同じ値がどこかのスタック上にのるとそこで動かなくなってしまうので、add と fetch での処理も併用されています。

svn: r55119 2016-05-22 20:03:44 +0900

r55118 のテストの行末の空白除去。