ruby-trunk-changes 2021-11-19

今日は Struct の高速化や文字列リテラル内の式の埋め込みの高速化、Module#private, #public などのメソッドの戻り値の変更、GC の統計情報に GC 時間を返す GC.total_time 追加や GC.stat に :time キーの追加などの変更がありました。

[3ce27552df] Jean Boussier 2021-11-16 13:14:28 UTC

標準添付ライブラリ date のバージョンを Date::VERSION という定数に定義して gemspec ファイルから ext/date/lib/date.rb を読み込んで正規表現で切り出すようにしています。

[39655aceb2] Hiroshi SHIBATA 2021-11-18 09:18:33 UTC

拡張ライブラリ date のバージョンを 3.2.2 に更新しています。

[6896324465] Kazuhiro NISHIYAMA 2021-11-18 11:52:03 UTC

gems/bundled_gems の typeprof と rbs のバージョンをそれぞれ 0.20.4 と 1.7.1 に更新しています。

[89b440bf72] Nobuyoshi Nakada 2021-11-18 12:47:18 UTC

2f1081a451f21ca017cc9fdc585883e5c6ebf618 で追加してた Dir.glob のキーワード引数 sort に true と false 以外の値を渡すと ArgumentError 例外が発生するようにしています。 [ruby-core:105928] [Feature #18287]

[e2b78440ba] Nobuyoshi Nakada 2021-11-18 13:21:05 UTC

GitHub Actions の設定に cancel-in-progress: true というのを追加して、同じブランチに? 新しいコミットが push されたら前の実行中のジョブをキャンセルするようにしているようです。

[f3dcb4bbf7] Burdette Lamar 2021-11-18 14:28:04 UTC

Integer のメソッドの rdoc 用コメントの移動や追加など。 https://github.com/ruby/ruby/pull/5139

[cdebf57ec6] Maxime Chevalier-Boisvert 2021-11-18 15:44:31 UTC

YJIT 向けのコマンドラインオプション --yjit-no-type-prop というのを追加しています。 YJIT のテストのためで生成する機械語オペランドの型昇格を抑制するということをしているようです。 https://github.com/ruby/ruby/pull/5135

[d48f5082e5] git 2021-11-18 15:44:50 UTC

version.h の日付更新

[ec574ab345] "Eileen M. Uchitelle" 2021-11-18 17:11:53 UTC

VM 命令の getclassvariable で cref の取得を遅延して vm_getclassvariable() 内で inline cache にヒットしなかった時にのみ取得するようにしています。クラス変数の取得がちょっと早くなるようです。 https://github.com/ruby/ruby/pull/5137

[75ecbda438] Jeremy Evans 2021-10-27 17:35:54 UTC

Module#private, #protected, #public, #module_function などのメソッドが引数の Symbol 群をそのまま戻り値に返すようにしています。なるほどなぁ。より正確には「無引数なら nil、引数1つだけなら引数をそのまま、2つ以上の引数が渡されたらそれらを配列にして返す」となっています。 [ruby-core:76047] [Feature #12495]

[ab737b1919] Jeremy Evans 2021-11-18 18:51:14 UTC

75ecbda438670ec12641d1324d0e81a52ee02e0a の変更に追随して Module#private, #protected, #public, #module_function の rdoc 用コメントの call-seq を修正し、NEWS にエントリを追加しています。

[ea02b93bb9] "Eileen M. Uchitelle" 2021-11-18 21:17:40 UTC

ec574ab3453709490b53b5cc761ec158103fe42a と同様に VM 命令 setclassvariable でも cref の取得を遅延して vm_setclassvariable() 内で inline cache がヒットしなかった時にのみ取得するようにしています。 https://github.com/ruby/ruby/pull/5143

[4adb012926] Jeremy Evans 2021-11-18 20:44:19 UTC

ブロック引数をそのまま委譲するための特別な引数の記法として def m(&) のように名前(変数)の指定のない記法と呼び出し時にも m(&) のような記法を追加しています。内部的な特別な変数名 '&' の ID でローカル変数として保持しておいてそれを利用するようです。てことは Binding#local_variable_get で取ることはできるのかな。 [ruby-core:69559] [Feature #11256]

[b08dacfea3] Jeremy Evans 2021-11-18 23:10:20 UTC

文字列リテラルに "#{}" で式を埋め込んだ時に内容が Symbol や 1桁の整数、nil/false/true などなどの時に生成する ISeq を工夫して最適化しています。 VM 命令の改名や新規命令追加(objtostring) もしていて、1桁の数値のための fstring を用意して不要なオブジェクト生成を抑制するなど細かな工夫をして結構大きな変更になっています。これは現実のプログラムで効くケースは結構ありそうですね。 [ruby-core:81905] [Feature #13715]

[349a179782] Koichi Sasada 2021-08-19 07:14:46 UTC

GC.stat が返す Hash に :time というキーを追加して GC にかかったトータルの時間? を msec で返すようにしています。

[c347038d4e] Koichi Sasada 2021-11-10 07:52:22 UTC

GC.measure_total_time= および GC.measure_total_time と GC.total_time というメソッドを追加して、nano sec で GC 時間を測定して返すようにしています。 349a1797828a1fa6acc3c0d30a2a24e884d02907 でビルド時の定義にしていた MEASURE_GC を実行時に on/off できるフラグによる判定にしています。

[6c64013978] Koichi Sasada 2021-11-11 14:00:42 UTC

c347038d4ea246d686fcd4ddc8761a91e4dd25abGC.total_time を uint64_t から返すのに Primitive.cexpr! で UINT64_2NUM() というマクロを Primitive.cinit! で局所的に定義して使っていたのを ULL2NUM() を使うように変更しています。

[be71c95b88] Koichi Sasada 2021-11-17 15:43:40 UTC

struct rb_iseq_constant_body::optimize_type メンバーをさらに rb_method_optimized_t という構造体の中に入れています。将来的に他のメソッド呼び出しの最適化関連のメンバーを増やすためにまず構造体化したということみたいです。

[82ea287018] Koichi Sasada 2021-11-18 02:01:31 UTC

ということで be71c95b88019a1ca7a030a757ce343b743d8aff で追加した構造体 rb_method_optimized_t にさっそく index というメンバーを追加して Struct の属性の取得/更新を行うメソッドの最適化に利用するようにしています。ついでに vm_call_method_each_type() から最適化されたメソッド呼び出しについての処理を vm_call_optimized() に切り出すリファクタリングなどが行なわれていますが、OPTIMIZED_METHOD_TYPE_STRUCT_AREF と OPTIMIZED_METHOD_TYPE_STRUCT_ASET という最適化の種類を追加していて、この時に直接関数呼び出しをするようにしているようです。過去にメンバーの最初の 10個までの最適化もあったのは削除しているようです。

[4b1dd75e6c] Yusuke Endoh 2021-11-19 01:09:51 UTC

349a1797828a1fa6acc3c0d30a2a24e884d02907GC.stat への :time の追加がビルド環境によってはコンパイラ警告によりビルドエラーになってたようなので明示的なキャストを追加しています。

[2730e45f45] David Rodríguez 2021-11-16 14:01:18 UTC

bundler で依存関係チェック時のコードのリファクタリング?

[55f574136c] David Rodríguez 2021-11-17 20:13:40 UTC

2730e45f4565ef41a08d2694be2a287c86f9e0ba と同じく bundler の依存関係チェックの処理で処理をメソッドに切り出すリファクタリング

[80f39d78df] David Rodríguez 2021-11-11 23:56:19 UTC

bundler の bundle update 時に Gemfile.lock に書かれていたのより古いバージョンの指定に Gemfile が書きかえられていた時に追随できるようにしているようです。

[39c4673e3c] David Rodríguez 2021-11-17 20:59:18 UTC

bundler の依存関係チェックの処理で Array#reduce を使って複雑に書いてたのを Array#map でシンプルに書きなおしています。