ruby-trunk-changes 2024-03-02

今日は主に引数処理の最適化まわりの修正などがありました。

[e484ffaf20] Jeremy Evans 2024-01-25 18:00:09 UTC

super() を使った時の引数の展開でも splatarray 命令を利用して不要な中間配列生成を抑制する最適化が効くようにしています。

[32c58753af] Jeremy Evans 2024-01-25 18:13:28 UTC

e484ffaf2016ae3261ce5810658f4634b434720e の続きで splatarray を利用した引数処理時の配列生成を抑制する最適化でブロック引数や keyword splat 引数も渡された時は効いていなかったのでこの時も効くようにしています。

[73371450c3] Jeremy Evans 2024-01-25 20:25:42 UTC

引数なしの super (ZSUPER) での引数処理で中間配列を抑制するための VM 命令 pushtoarray を利用する最適化を利用するようにしています。

[f446d68ba6] Jeremy Evans 2024-01-25 22:44:11 UTC

benchmark/ 配下に引数処理のベンチマークのためのスクリプトを追加しています。

[334e4c65b3] Jeremy Evans 2024-01-27 19:45:30 UTC

73371450c31ed6341858c6520b3cd2d3d451806e の再修正で真偽値に RBOOL() マクロを使うリファクタリングと super に渡された引数の配列が変更されるかどうかのフラグのセットする条件の間違いを修正しています。

[f3af5ae7e6] Jean Boussier 2024-03-01 14:07:57 UTC

e626da82eae3d437b84d4f9ead0164d436b08e1a の Struct.new のメモリリークのテストが時間がかかりすぎるので繰り返し回数を減らしています。 [ruby-dev:52069] [Bug #20311]

[162e13c884] Peter Zhu 2024-02-27 19:50:40 UTC

imemo.c の vm_ccs_free() で struct rb_callcache のポインタを rb_gc_is_ptr_to_obj() で ObjectSpace の heap 内にあるかどうかチェックしていましたがこれは不要とのことで、かわりに rb_objspace_markable_object_p() で即値オブジェクトや回収済みの slot でないかのチェックをするようにしています。どっちかというとより厳しいチェックになってる気がするけど heap 内かどうかのチェックは処理時間がかかるからかなぁ。

[88050ec179] Alan Wu 2024-03-01 01:53:48 UTC

YJIT の setlocal 命令の実装で不要なスタックの退避処理を削っています。

[661f9e6d03] Takashi Kokubun 2024-03-01 18:03:00 UTC

YJIT の VM 命令 opt_invokebuiltin_delegate を使ったメソッドかどうかの判定を修正して inline 化による最適化が効くようにしているようです。 https://github.com/ruby/ruby/pull/10152

[6f31dd495c] Peter Zhu 2024-03-01 18:38:49 UTC

gc.c の is_markable_object() という関数で check_rvalue_consistency() という関数を呼んでたのを削っています。

[70de3b170b] Takashi Kokubun 2024-03-01 19:16:31 UTC

Hash のメソッド群から hash メソッドを呼ぶ時の関数 obj_any_hash() から呼ぶメソッドが Kernel#hash のものだった時にメソッド呼び出しの処理をスキップして直接 rb_obj_hash() 関数を呼ぶように最適化しています。 https://github.com/ruby/ruby/pull/10160

[6da8f04e01] Peter Zhu 2024-03-01 19:51:57 UTC

irb のテストの正規表現エスケープ漏れ修正。

[99384bac28] Jeremy Evans 2024-02-01 20:28:32 UTC

明示的なキーワード引数と無名キーワード引数を両方受け取る def m(kw: nil, **) のようなメソッド定義の時に ISeq の flags に無名キーワード引数の存在を示すフラグがちゃんとセットされていなかった不具合を修正しています。YJIT でも同様の不具合があったのでそれも修正しているようです。

[5a3ae06a09] Peter Zhu 2024-03-01 19:41:07 UTC

gc.c の rb_obj_rgengc_writebarrier_protected_p() という関数が未使用になっていたので削除しています。

[61fbd29e14] Takashi Kokubun 2024-03-01 23:01:20 UTC

70de3b170bc87aa8ea924602dcea3bb58b4fe439 での obj_any_hash() の最適化で呼ぼうとしているのが Kernel#hash かどうかの判定を変更して、実装が rb_obj_hash() 関数であれば直接呼んでそうでなくても Kernel に実装されたメソッドを呼ぼうとしていたら rb_vm_call0() でメソッド起動するようにしています。 rb_exec_recursive_outer_mid() による再帰チェックは省いてもいいということかな。

[317163c79c] Takashi Kokubun 2024-03-01 23:07:40 UTC

YJIT と RJIT のための C binding を再生成して rb_cfunc_t という型を取り込むようにしています。 61fbd29e14c0bd06ca4c063ff34332b272874a13 の変更のためですね。

[607b86ed1f] Takashi Kokubun 2024-03-01 23:10:19 UTC

同じく RJIT の C binding の rb_cfunc_t 型の情報を型として扱うように tool/rjit/bindgen.rb に追加して rjit_c.rb を再生成しています。

[061c684084] Nobuyoshi Nakada 2024-03-01 14:58:16 UTC

File#chmod の実装に rb_thread_io_blocking_region() を利用して chmod(2)/fchmod(2) がブロックしても処理が固まらないようにしています。NFS の時とかにブロックする可能性があるのかな。

[5a4cd732f0] Nobuyoshi Nakada 2024-03-02 04:51:25 UTC

061c68408479a1cd7e1a1d6bbde215433f287302 の chmod と同様に File#chown の処理もシステムイコールがブロックしてもインタプリタがブロックしないようにしています。

[b000e7bb74] Yuta Saito 2024-03-01 05:47:07 UTC

configure で macOS でのみ POSTLINK 変数が設定されていたら LINK_SO 変数にその内容を追加していたのを、他のプラットフォームでも一律追加するようにしています。 3f633e57ac31492ea84ca0d4afa5189a264a828a の WASI 環境のための変更が効くようにするためでしょうか。

[71d511615b] Yuta Saito 2024-03-01 06:08:23 UTC

標準添付ライブラリ mkmf.rb で POSTLINK 変数が拡張ライブラリのための Makefile に伝播するようにしています。