ruby-trunk-changes 2020-06-03

今日はブロック呼び出しの VM コードの最適化や Time#inspect の不要なオブジェクト生成を抑える変更などがありました。

[ae8362fdc8] Jean Boussier 2020-06-02 13:33:05 UTC

NoMethodError のメッセージに receiver を埋め込む時に最近の変更で Module/Class だったら inspect ではなく name を使うようになった変更に対応した rubyspec のテスト追加。

[afefcade98] Burdette Lamar 2020-06-02 15:53:25 UTC

Hash#inspect の rdoc 用コメントの call-seq やサンプルでの表記が to_s になってたのを修正したり、そのほか Hash の rdoc 用コメントの書き直し。最近 Hash のドキュメントの書き直し多いな。正直内容的に欠けてたものが追加されてるのかはよくわかっていない。 https://github.com/ruby/ruby/pull/3162

[87bc95e7c7] git 2020-06-02 15:53:44 UTC

version.h の日付更新

[11c70b3162] 卜部昌平 2020-05-25 09:00:15 UTC

vm_invoke_block() から各 vm_invoke_iseq_block(), vm_invoke_symbol_block(), vm_invoke_ifunc_block() などブロックの種類毎の関数へのブロックを渡す引数を struct rb_captured_block からそれを wrap したオブジェクトの VALUE に変更して、内容に応じてポインタを取り出す処理を各関数内に移動するリファクタリング

[ec87a58d55] 卜部昌平 2020-05-26 01:14:17 UTC

vm_invoke_block() の引数に is_lambda を追加して vm_invoke_block() 内で block_handler_type_proc の時に goto を使って vm_invoke_iseq_block() を呼ぶように制御しているのを、ちゃんと専用の関数を作って vm_invoke_block() を再帰的に呼び直させるようにスッキリさせています。

[796f9edae0] 卜部昌平 2020-05-26 01:22:51 UTC

vm_invoke_symbol_block(), vm_invoke_ifunc_block() などの引数にも is_lambda を追加して、使わないので MAYBE_UNUSED を使って宣言するようにしています。また型を intl から bool に変更。単に可読性のために統一的なインターフェースにするためかなと思ったけどコミットログをみると、複数の分岐で末尾呼び出しで同じ引数を使ってると最適化されるかもしれないのでそれを狙っているみたいです。

[973883aaa1] 卜部昌平 2020-05-26 02:24:15 UTC

796f9edae0a48c2949345febd8189809fbfdb192 の続きで vm_invoke_block() で switch 文の分岐内で直接関数呼び出しせずに、呼び出す関数を関数ポインタとして代入しておいて最後に呼び出すようにしています。狙った最適化がされるように明示的に C でコードしたという感じですかね。

[36322942db] 卜部昌平 2020-05-27 13:36:12 UTC

vm_invoke_symbol_block() で vm_yield_with_symbol() を利用していたのを VM stack を弄って調整してからメソッド呼び出しの vm_call_opt_send() 関数を流用するようにしています。 vm_exec() の呼び出しのネストを減らすためらしいです。

[054c2fdfdf] 卜部昌平 2020-05-28 03:33:53 UTC

36322942dbce6dedaf67626b152dbf893d42e082 の続きで VM stack の調整のための MEMMOVE() が冗長になる条件を dynamic な Symbol を使って send するケースのほうに寄せるリファクタリング。たぶんそっちのほうが使われる頻度が低いんじゃないかということみたいです。

[6302b96368] 卜部昌平 2020-05-28 03:41:48 UTC

vm_call_symbol() にいくつか空行を追加。読みやすさのため。

[ba20e6080d] 卜部昌平 2020-05-29 01:47:09 UTC

vm_invoke_block() の変数名に auto 修飾子がついてたのを削っています。 C の auto 修飾子久しぶりにみた。

[b61e82eac9] 卜部昌平 2020-05-31 07:44:42 UTC

054c2fdfdfe9d43c3ae4ba508bb419c3e9db015f の変更で vm_call_symbol() の VM stack 調整時に VM stack の overflow チェックを追加しています。

[de5e0f7c06] 卜部昌平 2020-05-31 08:34:58 UTC

ec87a58d556c83bbec44c2df8444d95df56379a4 で goto を消すために vm_invoke_block() から切り出した vm_invoke_proc_block() で vm_invoke_block() を再帰呼び出しした先でまた vm_invoke_proc_block() を呼び出してしまうのを避けるためここで vm_block_handler_type() の結果が block_handler_type_proc のあいだは vm_proc_to_block_handler() で辿るようにしています。 Proc オブジェクトのブロックを取り出したらそれがまた Proc オブジェクトだった、ということだと思うけど、ブロック引数の委譲をネストさせると何段にもなり得るのかな。

[eb2b7fca43] Nobuyoshi Nakada 2020-06-03 08:23:04 UTC

56ca006784d8737463857776a807c6f656ca8455 の EnvUtil.terminate でバックトレースを得るために macOS で lldb を使うようにしたのを、送信しようとしたシグナルが SIGABRT か SIGKILL の時だけ実施するようにしています。また Process.wait に成功した時にも再度残りのシグナルも試そうとループの続きを実行してしまっていたのを修正しています。

[160511d851] Benoit Daloze 2020-06-03 10:11:58 UTC

5a79d8e0507cd143100bf928a88a59a8b5a5bca6 で追加した Net::HTTP.get のテストが CHECK_LEAKS=true で実行するとよく失敗するそうでプロセス分離して実行させるようにしています。

[ee35a4dad3] Nobuyoshi Nakada 2020-06-03 03:42:47 UTC

Time#inspect の実装で小数点以下の秒数を追記するのに rb_enc_sprintf() で新しい String オブジェクトを作っていたのを、元の String オブジェクトに追記するようにしてオブジェクト生成を減らしています。