ruby-trunk-changes r54107 - r54122

今日は Unicode の spacial casemap を利用するようにする変更や Enumerable#inject の Array (特に Fixnum の配列)向けの最適化などがありました。

nobu: r54107 2016-03-15 09:28:17 +0900

r54103 の ruby --version オプションのテストで正規表現を作る時に Regexp.quote でメタキャラクタをエスケープしておくようにしています。また正規表現を定数に入れておいて1回だけコンパイルするようにしています。

nobu: r54108 2016-03-15 09:47:46 +0900

r54105 の Marshal.load の修正で追加されたテストで子プロセスを使うテストを EnvUtil.invoke_ruby から assert_ruby_status を使う方法に書き直しています。

hsbt: r54109 2016-03-15 09:56:45 +0900

Time#dst? の rdoc 用コメントの typo 修正。 https://github.com/ruby/ruby/pull/1290

hsbt: r54110 2016-03-15 12:51:19 +0900

doc/extension.rdoc および doc/extension.ja.rdoc のマークアップの修正。 [ruby-core:74143] [Bug #12143]

nobu: r54111 2016-03-15 13:41:24 +0900

variable.c の rb_gc_mark_global_tbl() が export されてたのを非公開にしています。

duerst: r54112 2016-03-15 13:49:24 +0900

enc/unicode.c で CaseMappingSpecials.txt からのデータを元にしたフラグを利用するマクロがちゃんとフラグを参照するように定義しています。また onigenc_unicode_case_map() で特殊な casemap のフラグをみて処理を分岐するようにしています。 r54101 はまだフラグを利用するようにはなってなかったんですね。

svn: r54113 2016-03-15 13:49:25 +0900

r54112 の行末の空白除去。

nobu: r54114 2016-03-15 15:42:27 +0900

gc.c で rb_gc_mark_locations() という gc_mark_locations() の wrapper マクロを展開してマクロ定義を削除しています。

nobu: r54115 2016-03-15 15:42:29 +0900

gc.c に rb_objspace_of() というマクロを追加して rb_vm_t から objspace を取り出すのをマクロ化しています。また gc_finalize_deferred_register() の引数に rb_objspace_t のポインタを受け取るよう追加して finalizer の登録を object space を認識して行うようにしています。 ChangeLog に後者の変更が書かれてないですね。こちらのほうが本命のような気がしますけど。

nobu: r54116 2016-03-15 16:02:09 +0900

rb_gc_mark_machine_stack() からマシンスタックの範囲の mark 処理を mark_stack_locations() という関数に切り出して mark_current_machine_context() でもこの関数を利用するようにリファクタリングしています。

duerst: r54117 2016-03-15 16:17:09 +0900

r54112 の onigenc_unicode_case_map() での特別処理で不要な goto での条件分岐のフロー制御をやめ(まだもう1つ goto は残ってますが)、関数マクロ呼び出しをネストさせるのはやめてローカル変数に一度受けるようにしたりするリファクタリング(マクロの引数に *next++ が含まれていて複数回評価されるように展開されるとまずいので不具合修正もあるかも)しています。

duerst: r54118 2016-03-15 16:29:51 +0900

r54112 および r54117 の onigenc_unicode_case_map() で特殊な casemap を使うときと通常時の共通の処理を分岐の後に括り出しています。

akr: r54119 2016-03-15 20:27:34 +0900

Enumerable#inject の実装で receiver が Array オブジェクトで、処理が第2引数の Symbol で渡されていた時に each が再定義されてなければ Array 専用の処理を C で実装する最適化を行っています。 inject ってブロックじゃなくて引数で呼び出すメソッドを指定できたのか。 ary.inject(0, :+) みたいなのがブロック呼び出しなしで実行されるので高速になります。

akr: r54120 2016-03-15 20:42:23 +0900

r54119 に続いてさらに Enumerable#inject で Array の要素が Fixnum で operator が :+ の時にはメソッド呼び出しすら省略して直接加算するようにしています。 Fixnum#+ の再定義のチェックがされてないですね。というのはこの後で修正されてました。

kazu: r54121 2016-03-15 21:47:18 +0900

r54120 の ChangeLog エントリの typo 修正。

akr: r54122 2016-03-15 21:53:06 +0900

r54120 で Array の要素が Fixnum で operator が :+ だった時の最適化で Fixnum#+ の再定義がチェックされてなかったのをチェック追加しています。 [ruby-dev:49510] [Bug #12178]