ruby-trunk-changes 2020-06-24

今日は MJIT によるメソッド inline 化による最適化の強化や ruby 実装による組み込みメソッドで TracePoint の return イベントが発火しなくなってた不具合の修正、拡張ライブラリ ripper でインデント不一致の警告が検出されなくなってた不具合の修正などがありました。

[dc351ff984] Burdette Lamar 2020-06-23 13:58:26 UTC

Array のメソッドの rdoc 用コメントの英文修正やサンプル追加など。 https://github.com/ruby/ruby/pull/3237

[b71047cca3] Masataka Pocke Kuwabara 2020-06-23 12:11:03 UTC

RubyVM::AbstractSyntaxTree モジュールの rdoc 用コメントの説明でこれが Class だと書かれてたところを修正。

[fbb32b1f48] git 2020-06-24 06:18:18 UTC

version.h の日付更新

[3e02cd518f] Takashi Kokubun 2020-06-24 06:41:57 UTC

ruby 実装によるメソッド定義で Primitivie.func みたいなメソッド呼び出しにみせかけた C 関数呼び出しを利用したメソッドからの return イベントが TracePoint で発火しないという不具合の修正。C 関数を末尾呼び出ししてて opt_invokebuiltin_delegate_leave 命令を使う時に trace 版命令としては opt_invokebuiltin_delegate の trace あり版を使わないといけなかった模様。うーんこれってつまり trace 版に ISeq を書き換える時に opt_invokebuiltin_delegate_leave を使ってたところは opt_invokebuiltin_delegate + leave 命令になるんでしたっけ? この変更がそうするためのものなんだろうか(しかしこれで leave が追加されるような気がしないけど)。
[追記] 元々 opt_invokebuiltin_delegate_leave を使う場合でもその後に leave 命令が追加されるようにコンパイルされていたので、trace 化時に命令を変えるだけで leave に fallback できる状態だったそうです。 https://twitter.com/k0kubun/status/1275858824134459392 [/追記]

[946e5cc668] Takashi Kokubun 2020-06-24 06:49:03 UTC

Kernel#class メソッドを C 関数定義から ruby 実装による C API 呼び出しを Primitive.cexpr! で行なうようにして、さらに Primitive.attr!("inline") を指定することで MJIT での inline 化可能にする最適化。組み込みメソッドを ruby 実装にして JIT したら速くなるねという話が実際に進行してきていますね。 https://github.com/ruby/ruby/pull/3250

[6ecef1199e] Takashi Kokubun 2020-06-24 06:50:31 UTC

3e02cd518fbe4d91c2aca7fbc3c5aafa387d3cb7 の rb_vm_encoded_insn_data_table_init() での変更で警告避けのための明示的なキャスト追加。

[e0037997d9] Takashi Kokubun 2020-06-24 06:56:01 UTC

GitHub Actions の各種コンパイラでのビルドを試す Actions での slack 通知のメッセージに workflow 名を含めるようにしています。

[737da8d383] Takashi Kokubun 2020-06-24 06:57:26 UTC

さらに 3e02cd518fbe4d91c2aca7fbc3c5aafa387d3cb7 の rb_vm_encoded_insn_data_table_init() での追加部分の明示的なキャスト追加。

[50c63ab38d] Takashi Kokubun 2020-06-24 07:29:53 UTC

ruby 実装された組み込みメソッドで C 関数を呼び出して戻り値にしているものの ISeq に opt_invokebuiltin_delegate_leave 命令が使われてることを確認するテストが 3e02cd518fbe4d91c2aca7fbc3c5aafa387d3cb7 の変更で TracePoint が有効な状態だと失敗してしまうので子プロセスを起動してそこで ISeq を取り出させるように修正しています。

[7f29e34f35] Nobuyoshi Nakada 2020-06-24 10:50:51 UTC

拡張ライブラリ ripper のテストのヘルパーメソッド warning/warn で DummyParser#parse のブロック内で return してるのでメソッド呼び出し以降には処理が続かないはずなのでそれを明確にするため処理が到達すると assert(false) で明示的に失敗させるようにしています。

[263b941321] Nobuyoshi Nakada 2020-06-24 10:53:14 UTC

拡張ライブラリ ripper の Ripper#parse でインデントの不整合についての警告が Ripper#warn メソッドで検出されなくなっていた不具合を修正しています。 yylex() 内での dispatch_delayed_token() や dispatch_scan_event() の呼び出しをソース内の位置を表す yylloc へのセットの後に移動しています。いやーこの差分で警告が出なくなってたというのはさすがにテストなしでは気がつけないのでやっぱり parser は難しいですね。 [ruby-core:98928] [Bug #16981]