今日は 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#+ の再定義のチェックがされてないですね。というのはこの後で修正されてました。
akr: r54122 2016-03-15 21:53:06 +0900
r54120 で Array の要素が Fixnum で operator が :+ だった時の最適化で Fixnum#+ の再定義がチェックされてなかったのをチェック追加しています。 [ruby-dev:49510] [Bug #12178]