ruby-trunk-changes 2023-03-20

今日は主に Process.pid の結果をキャッシュして不要なシステムコール発行を抑制する最適化や、RJIT のサポートする VM 命令の拡張やメソッドの inline 化による最適化などがありました。

[bcd0aa896f] Nobuyoshi Nakada 2023-03-19 12:57:22 UTC

ractor.c の ractor_try_yield() や ractor_basket_prepare_contents の引数に volatile 修飾子を追加しています。 GCC の "clobbered nby 'longjmp' or 'vfork'" 警告抑制のため。

[2121282753] Takashi Kokubun 2023-03-19 06:49:11 UTC

RJIT で String#<< メソッドを直接コード生成する最適化を追加。

[cd5a8d0160] Takashi Kokubun 2023-03-19 20:36:26 UTC

RJIT で単項演算子メソッド String#+@ を直接コード生成する最適化を追加。

[95c4ced39e] Takashi Kokubun 2023-03-19 20:41:04 UTC

RJIT で Array#empty? メソッドを直接コード生成する最適化を追加。もうやってたような気がしたけど前回のは String#empty? でした。

[83ad1cac81] Takashi Kokubun 2023-03-19 20:46:09 UTC

RJIT で Kernel#respond_to? メソッドを直接コード生成する最適化を追加。

[2f29044de4] Takashi Kokubun 2023-03-19 21:15:45 UTC

RJIT で Kernel#block_given? メソッドを直接コード生成する最適化を追加。

[615f42fd61] Soutaro Matsumoto 2023-03-20 01:39:17 UTC

tool/rbs_skip_tests に rbs のテストの skip の指定の書きかたのコメントを追加しています。また gems/bundled_gems の rbs のテストに使う commit hash の指定を更新しています。

[c6466691be] Nobuyoshi Nakada 2023-03-20 02:36:46 UTC

GitHub Actions の Ubuntu 環境でのテスト実行時に RUBYOPT=-w を指定して警告メッセージ出力するようにしています。

[4f350dbfdd] Takashi Kokubun 2023-03-20 03:27:55 UTC

lib/ruby_vm/rjit/insn_compiler.rb で代入しても使用していない変数を削除。

[80890e681a] Nobuyoshi Nakada 2023-03-20 03:15:27 UTC

c6466691be5949cb9840003644ff1362e7cb35b5 の再修正で test-bundler と test-bundled-gems では -w オプションをつけないように修正しています。

[2d8ecfcc9a] Takashi Kokubun 2023-03-13 05:27:43 UTC

RJIT で VM 命令 invokeblock で ISeq によるブロックの起動の対応を追加。

[7f696b8859] Takashi Kokubun 2023-03-20 04:02:16 UTC

bootstraptest/runner.rb の警告抑制のため未使用だった rescue 節の例外オブジェクトの変数への束縛を削除しています。

[7aeb9e20b9] Takashi Kokubun 2023-03-20 04:20:17 UTC

2d8ecfcc9a1cf65104bd0f61542a969dc3bd2317 の追加修正で RJIT による invokeblock 命令の ISeq によるブロック起動を一時的に無効に戻しています。 btest でエラーが発生しているとのこと。

[e3dc25acae] Takashi Kokubun 2023-03-20 04:49:51 UTC

2d8ecfcc9a1cf65104bd0f61542a969dc3bd2317 および 7aeb9e20b90bf16d25fcc76c619bf971f4c47ec5 の続きで RJIT による VM 命令 invokeblock のコンパイルの対応修正。ブロックに渡す引数が対応できるかどうかのチェックを追加しているようです。

[47f7ec1c9f] Takashi Kokubun 2023-03-20 06:11:52 UTC

RJIT の VM 命令 invokeblock の対応の再修正。ブロックに渡す引数が不正な時の対応を追加しているようです。

[59b86da82c] Takashi Kokubun 2023-03-20 06:19:58 UTC

RJIT の VM 命令 invokeblock 対応で Symbol からメソッド呼び出しをブロック化したものを呼び出す時の対応も追加しています。

[70ea58bd5b] Takashi Kokubun 2023-03-20 04:18:09 UTC

RJIT で YJIT と同様にメソッドやブロックの引数の渡しかた/受け取りかたによる JIT コンパイルをあきらめる理由のカウンタを細かく分けてカウントするようにしています。

[1db8951d3a] Jean Boussier 2023-02-16 18:36:31 UTC

Process.pid の結果をキャッシュして getpid(2) を毎回実際に呼ばずにすませるようにしています。当然 Kernel#fork するとキャッシュはクリアします。コミットログによると daemon 系のプログラムで fork を検出するために頻繁に pid を取得して比較するというテクニックがあるのだけど実際にシステムコールを呼ぶと遅いのでキャッシュしたいということみたいです。 libc の実装によっては libc のレイヤでキャッシュしてくれるそうですが、libc を使わずに直接 syscall を使って fork する実装で問題があるため最近の libc はキャッシュしてくれないので ruby の実装のレイヤでキャッシュするのが良いということみたいです。 [ruby-core:112457] [Feature #19443]

[1aa2555044] Nobuyoshi Nakada 2023-03-20 08:28:24 UTC

file.c の rb_stat_ww() の定義で preprocessor マクロでチェックしているマクロを S_IROTH から実際に参照している S_IWOTH に修正しています。まあおそらくだいたいセットで定義されるマクロなのでしょうけど。

[758e4db551] Nobuyoshi Nakada 2023-03-20 09:08:05 UTC

1db8951d3a8be6a756c9d3d3b87231997b301985 で導入された Process.pid の値のキャッシュのための static 変数 が T_BIGNUM になる可能性がありそうだったら rb_gc_register_address() で GC の mark 対象として登録しておくようにしています。