ruby-trunk-changes r67572 - r67600

今日はなんといってもパターンマッチの文法が experimental ではありますが追加されました。これだけ大きな文法上の追加はひさしぶりのことです。また MJIT にも method inlining という今後主要な速度向上のキーになりそうな最適化の最初の実装が追加されています。

k0kubun: r67572 2019-04-17 02:01:05 +0900

r67566 で分離した mjit_compile_body() を利用して MJIT の method inlining を実装しています。ISeq 型の(つまり Ruby によって定義された)メソッド呼び出しが、末尾呼び出しである、ISeq が例外発生時に呼び元の control frame を pop しないタイプ(catch_except_p)である、ISeq のサイズが制限内であるなどの条件を見たした時に inline 化可能な C のソースコードを作っておいて、その ISeq の呼び出しの部分にそのまま埋め込むようにしています。Control Frame は積むのでバックトレースとかはちゃんと出るけど C のコードとしてはインライン化されてる、という意味だと思います、多分。

svn: r67573 2019-04-17 02:01:07 +0900

version.h の日付更新。

k0kubun: r67574 2019-04-17 02:02:16 +0900

で今度は r67572 に続いて frame-omitted method inlining というのを MJIT の実装に追加しています。今度はテンプレートの変更も含んでてもうちょっとマイクロに、メソッド呼び出しも例外発生もしないような短い ISeq になるようなメソッドはスタックに control frame を積まずにメソッド呼び出しに相当する処理自体を省くようにしているということだと思います。あんまりちゃんと読んでないですけど。

k0kubun: r67575 2019-04-17 02:02:35 +0900

そして r67572 および r67574 の method inlining も MJIT の JIT compile のオプションとして、他の最適化と同様に失敗したら off にしてコンパイルしなおすようにしています。

tenderlove: r67576 2019-04-17 12:17:25 +0900

r67499 で関連コミットその他も巻き込んで revert された r67479 の GC.compact メソッド追加のリトライ。 [ruby-core:91634] [Feature #15626]

svn: r67577 2019-04-17 12:17:42 +0900

r67576 のインデントのタブを空白に展開。

svn: r67578 2019-04-17 12:17:42 +0900

r67576 の新規追加ファイルの svn property 設定。

tenderlove: r67579 2019-04-17 13:05:29 +0900

r67576 で再追加したテストで GC.compact のかわりに GC.compact で移動されたオブジェクトの slot を参照しているものがないことを追加で確認する GC.verify_compaction_references を呼び出すようにしています。

tenderlove: r67581 2019-04-17 14:19:05 +0900

そして GC.verify_compaction_references の実装を GC.compact の実装にそろえて gc_check_references_for_moved() を呼ぶ前に gc_update_references() を呼んだり、チェック後に GC しなおしたり method cache/constant cache をクリアしたりして不正な参照を残さないように? しています。

nobu: r67582 2019-04-17 14:34:46 +0900

String#split で空文字列を指定して文字単位に分割する時の最適化パスを追加しています。元々 String#split には awk(ってなんだろ)、string といったパターンの最適化パスがあったところに文字単位の chars というのを追加しています。

tenderlove: r67583 2019-04-17 15:13:11 +0900

GC.compact の実装で T_CLASS および T_ICLASS 型オブジェクトの super の参照を移動するタイミングを rb_classext_t へのポインタが NULL でも実行するように前のほうに移動しています。

tenderlove: r67584 2019-04-17 15:16:35 +0900

r67583 と同様に gc_mark_children() でも super の mark を classext の NULL チェックの前にしています。 これって r67576 の前からですよね。ということは元からバグがあったのか r67576 で classext が NULL でかつ super があるという T_MODULE/T_CLASS が存在するようになったのか……(たぶん前者)。

svn: r67585 2019-04-17 15:16:39 +0900

r67584 のインデントのタブを空白に展開。

ktsj: r67586 2019-04-17 15:48:03 +0900

パターンマッチが入りました! パターンマッチの機能についての議論ぜんぜん追ってなかったので実は仕様を知らないのですが、ともかく新しい文法の追加と、それに対応して compile の追加がありました。VM 命令の追加はないようです。あとは……文法とかはチケットやテストを参照してください(まだ理解してない)。 [ruby-core:87945] [Feature #14912]

ktsj: r67587 2019-04-17 15:48:05 +0900

r67586 の追加変更で Struct をパターンマッチに使った時のための Struct#deconstruct メソッドの追加。実体としては to_a と同じです。

svn: r67588 2019-04-17 15:48:07 +0900

r67586 の新規追加ファイルの svn property 設定。

svn: r67589 2019-04-17 15:48:26 +0900

r67586 のインデントのタブを空白に展開。

nobu: r67590 2019-04-17 16:09:24 +0900

make update-unicodeUnicode の Emoji 関係のファイル群もダウンロード試行するようにしています。

nobu: r67591 2019-04-17 16:09:28 +0900

tool/downloader.rb で IO.read のかわりに File.read を使うように修正しています。 oh...

yui-knk: r67592 2019-04-17 16:15:08 +0900

r67586 のパターンマッチ実装で予約語 in に対応する NODE を --dump=parsetree_with_comment でダンプした時のコメントの typo 修正。

nobu: r67593 2019-04-17 16:35:27 +0900

make update-unicode-property-files と make update-unicode-files を統合して make update-unicode-files で両方のファイル群をダウンロードするようにしています。

nobu: r67594 2019-04-17 16:35:29 +0900

tool/downloader.rb で Unicode 関連の beta バージョンのファイルダウンロード時に index.html ファイルの内容の一致でキャッシュを捨てるかどうかの判定に使うようにしているようです。

kazu: r67595 2019-04-17 17:39:52 +0900

r67586 のパターンマッチの文法追加では experimental な機能だということを警告で出力しているため、テストでこの警告が大量に出てつらいということで、テストクラス定義部分全体をヒアドキュメントにして、$VERBOSE を nil にした上で eval するという方法で警告抑制するようにしています。そうか parse 時点で警告が出るので実行時に $VERBOSE をいじっても抑制できないわけか。

kazu: r67596 2019-04-17 17:53:32 +0900

r67595 と同様に r67586 のパターンマッチのテストでさらに内部で eval しているところでも警告を抑制するようにしています。

k0kubun: r67597 2019-04-17 18:24:48 +0900

NEWS ファイルに MJIT が最適化(cache の利用や method inlining など)が理由でキャンセルされた時に最適化をオフにして再度コンパイルに挑戦するようにしたことについて追記しています。

tenderlove: r67598 2019-04-17 18:41:41 +0900

r67576 およびその後の GC.compact 関連の変更を再度 revert しています。 CI で直接関係ないところで SEGV が起きてしまっていたようです。

svn: r67599 2019-04-17 18:41:55 +0900

r67598 のインデントのタブを空白に展開。

hsbt: r67600 2019-04-17 22:20:02 +0900

NEWS ファイルに rubygems と bundler のバージョン更新について追記しています。