今日は RJIT のサポートするメソッドタイプの拡張や最適化、default gems のバージョン番号を定数として定義するようにする変更などがありました。
[f25791884c] Stan Lo 2023-04-02 14:11:07 UTC
標準添付ライブラリ irb の未使用になってたコードの削除をしているようです。 https://github.com/ruby/irb/pull/554
[cd94bcdc46] Stan Lo 2023-03-30 16:17:17 UTC
標準添付ライブラリ irb で RUBY_ENGINE をみて CRuby でのみ対応していたコマンドのチェックをはずして JRuby や TruffleRuby でも動作させるようにしています。
[7778c292c4] Takashi Kokubun 2023-04-02 07:03:24 UTC
RJIT にメソッド呼び出し時にキーワード引数を渡して呼び出されている場合のコンパイルの対応を追加しています。
[62188c8584] Takashi Kokubun 2023-04-02 17:27:17 UTC
RJIT の side exit の理由のカウンタの種類を追加しています。
[6f2535deda] Takashi Kokubun 2023-04-02 17:40:37 UTC
lib/ruby_vm/rjit/insn_compiler.rb で RJIT の C binding 用の定数の参照に "C::" の名前空間を明示するように修正しています。
[cd1cd8030c] Takashi Kokubun 2023-04-02 17:46:27 UTC
RJIT でメソッド呼び出し時に配列を splat して渡す呼びかたをしている時のコンパイル対応を追加しています。
[5cc644b147] Takashi Kokubun 2023-04-02 18:01:23 UTC
RJIT の side exit の理由のカウンタのうちブロック引数に関するものを 1つにまとめています。
[bf7587748d] Takashi Kokubun 2023-04-02 18:07:50 UTC
RJIT のコンパイラ実装で jit_search_super_method メソッドを呼び元に展開するリファクタリング。
[3fe134759c] Takashi Kokubun 2023-04-02 19:23:22 UTC
テストで使う assert_linear_performance という assertion メソッドで RJIT が有効な時には計算時間の比較チェックをスキップするようにしています。また RJIT のコンパイラで super の呼び出しの時の処理を削っています。これは意図的に混ざってるのかな?
[284a0ff96c] Takashi Kokubun 2023-04-02 19:28:49 UTC
3fe134759cc4904c74306e0832c22fa518a5bea2 で削除した RJIT のコンパイラで super 呼び出し時の分岐で if 文の内容がなくなってしまっていたので条件分岐自体を消しています。またこれにより不要になった jit_caller_setup_arg_block メソッドの is_super 引数自体を削除しています。どうやら呼び元が 1つだけで常に false を渡す状態になってたので dead code だったようですね。
[ad2b719fc2] Takashi Kokubun 2023-04-02 21:32:49 UTC
RJIT の C binding のメソッド C::FL_TEST_RAW の結果を 0 と比較していましたが元から真偽値がかえってくる? みたいなので比較を削除しています。
[4fc336127e] Takashi Kokubun 2023-04-02 21:44:40 UTC
RJIT で省略可能な引数を持つように定義されたメソッドのコンパイルの対応を追加しています。
[6002b12611] Takashi Kokubun 2023-04-02 22:26:46 UTC
RJIT がコンパイルするコードで最初に rb_rjit_entry_stub_hit() という関数を呼び出して使いまわせる既存のコンパイル結果がないか探すようにしている? みたいです。
[8968b47ba8] Takashi Kokubun 2023-04-02 23:46:32 UTC
RJIT の VM 命令 getlocal と setlocal のコンパイル処理のメソッドの位置を移動して内容も共通処理を使いまわすようにリファクタリングしているようです。
[2f1586f6f2] Nobuyoshi Nakada 2023-04-02 08:50:22 UTC
テスト時に make leaked-globals も自動で実行するようにして GitHub Actions や CirrusCI で明示的に実行するアクションを追加していたのを削除しています。
[a70653ca7f] Hiroshi SHIBATA 2023-03-30 04:05:45 UTC
標準添付ライブラリ find でバージョン番号を Find::VERSION という定数として定義して gemspec ファイルからそれを切り出して設定するように変更しています。
[6dcd399976] Hiroshi SHIBATA 2023-03-30 05:17:44 UTC
標準添付ライブラリ tsort でもバージョン番号を TSort::VERSION という定数に定義して gemspec ファイルからはそれを切り出して設定するように変更しています。
[ba4f01f0a0] Hiroshi SHIBATA 2023-03-30 05:19:53 UTC
標準添付ライブラリ yaml でもバージョン番号を YAML::VERSION という定数で定義して gemspec ファイルからはそれを切り出して設定するように変更しています。
[14f442a958] Hiroshi SHIBATA 2023-03-30 04:06:08 UTC
標準添付ライブラリ base64 でもバージョン番号を Base64::VERSION という定数で定義して gemspec ファイルからはそれを切り出して設定するように変更しています。
[b5c8c73f66] Hiroshi SHIBATA 2023-04-03 03:00:59 UTC
a70653ca7facbb2004562e5718fa51e7ade6b157、6dcd39997679914dad1c23f95adb3f7d84ec5942、14f442a9584989805be8e40caa0de7758bf07532 でバージョン番号を定数として定義するようにした変更で gemspec で version.rb から文字列操作で切り出す処理で version.rb を探すためのファイルパスの決定で親ディレクトリを辿るようになっていたのをやめています。けどこれだと "../../.." みたいになるかわりに "//" になるけどこれでいいのかな? まあいずれにせよみつかるはずですが。
[27f709aa3c] Hiroshi SHIBATA 2023-04-03 03:43:11 UTC
標準添付ライブラリ yaml の YAML::VERSION については YAML は Psych の別名なので Psych::VERSION と衝突してしまうため YAML::LOADER_VERSION と改名して gemspec で切り出す定数名も変更しています。
[6fb6d85aee] Hiroshi SHIBATA 2023-04-03 05:18:22 UTC
標準添付ライブラリ fileutils のバージョンを 1.7.1 に更新しています。
[09ad7e20d3] git 2023-04-03 05:20:16 UTC
NEWS ファイルの default gems のバージョンリストに fileutils を追加しています。
[d546f8c518] Takashi Kokubun 2023-04-02 23:59:07 UTC
RJIT で VM スタックの内容の型情報を RubyVM::RJIT::Context というクラスのインスタンスで保持するようにしています。
[50285d2864] Takashi Kokubun 2023-04-03 06:05:55 UTC
d546f8c5183d583b2455ef005b9276a22bab3b65 の続きで RubyVM::RJIT::Context#stack_swap で型情報も入れ替えるよう対応を追加しています。
[eb51248c4c] Takashi Kokubun 2023-04-03 05:52:13 UTC
RJIT で型情報として具体的な型はわからないけど即値かそうでないかは判定できるというのに対応しています。即値と分かっていたら GC 関連の処理を省略したりできるからそういう最適化のためかな。
[3bacc3877a] Takashi Kokubun 2023-04-03 06:22:53 UTC
RJIT で 6002b12611c3cee921fc8aef76b55db4b2d0fbcd で追加したコンパイル済みのコードの再利用のために検索する処理で RubyVM::RJIT::Context の内容の差分をみてできるだけ同じ条件のものを探すという処理を追加しているようです。完全に一致してないといけない部分もあるけど型情報など少し違っていてもいいものは極力似てるものを選ぶということをするみたいです。
[d876c008ec] Takashi Kokubun 2023-04-03 06:34:57 UTC
RJIT で ISeq ごとにコンパイル結果のコードを保持する上限を 4に定めています。それを越えたら型情報を持たない Context を作ってそれを使うようにしています。
[f0b69eb14f] Takashi Kokubun 2023-04-03 06:48:09 UTC
RJIT で VM スタックの型情報で T_ARRAY 型であることを宣言する guard_object_is_array で同時に即値でないオブジェクトであるという情報も保持させるようにしています。また Array クラスのオブジェクトなのか Array を継承した子クラスのオブジェクトなのかの情報も設定するようにしています。
[0abe9d8b32] Takashi Kokubun 2023-04-03 06:53:15 UTC
同じく RJIT で VM スタックの値が T_STRING 型オブジェクトであることを宣言する guard_object_is_string メソッドで同時に即値でないという情報も含めるようにしています。また String クラスのオブジェクトか、それを継承した子クラスのオブジェクトかの情報も判定しておくようにしています。
[1d452c2cf8] Takashi Kokubun 2023-04-03 07:02:45 UTC
同じく RJIT の guard_two_fixnums メソッドでもより詳しい VM スタックの型情報のチェックを追加しています。
[ca8102355a] Takashi Kokubun 2023-04-03 07:09:28 UTC
同じく RJIT の VM スタックの型情報を更新する jit_guard_known_klass で可能なら型情報を絞り込むようにしています。またデバッグのため? の assert メソッドを埋め込んでいます。
[46e93ef53d] Takashi Kokubun 2023-04-03 07:49:10 UTC
RJIT でメソッド呼び出し時の receiver の型情報を利用可能にするようにしています。