ruby-trunk-changes 2023-02-25

今日は主に標準添付ライブラリ set の Set#merge の引数の仕様変更や ObjectSpace.trace_object_allocations_start でオブジェクトの確保位置を取得するためのフックで行番号が正しく取れないことがある不具合の修正などがありました。

[454ac4cbb2] Akinori MUSHA 2023-02-24 06:58:19 UTC

標準添付ライブラリ set の Set#merge に複数の引数を受付けるようにしています。 * で受け取ってるので逆に無引数で渡しても通るようになってますね。

[5d5ff6e5ed] Akinori MUSHA 2023-02-24 08:37:00 UTC

さらに標準添付ライブラリ set の Set#merge の定義に **nil を追加して、キーワード引数は受付けないことを明示するようにしています。こうすることで set.merge(a: 1, b: 2) みたいな呼びかたを明示的に拒否するようにしているようです。キーワード引数分離の仕様の一環という感じでしょうか。

[07403de5a8] Stan Lo 2023-02-24 13:34:35 UTC

標準添付ライブラリ irb のテストで skip していたものを実施するように復帰させるのと、冗長なテストがあったとのことでテストメソッドをひとつ削除しています。

[d8d152e681] Takashi Kokubun 2023-02-24 14:01:53 UTC

YJIT の Rust 実装で利用している TempMapping というクラス(っていうのかな)の実装を少し変更しているようです。リファクタリング的な変更? https://github.com/ruby/ruby/pull/7368

[05f016cdad] Burdette Lamar 2023-02-24 19:09:00 UTC

標準添付ライブラリ net/http の rdoc 用コメントの手直し。

[d2631c427e] Peter Zhu 2023-02-24 13:48:26 UTC

VM 用のコード生成用のライブラリ tool/ruby_vm/models/c_expr.rb の RubyVM::CExpr#inspect メソッドで行番号が得られない時の対応を追加しています。

[3e09822407] Peter Zhu 2023-02-24 14:20:14 UTC

d2631c427ee723f6136ac1e08dd3c9c5b04c6725 の続き? ObjectSpace.trace_object_allocations_start でオブジェクトの確保された位置をトレースするフックが設定されている時に VM の最適化により命令の行番号が正しく得られなくなる場合がある不具合を修正しているようです。 VM 命令が leaf という例外を発生させる可能性がない種類のものとそうでない時とで VM の pc のインクリメントのタイミングが異なるため、フックの実行のタイミングでは行番号を得るための命令の特定が間違えている場合があったようです。 [ruby-core:112534] [Bug #19456]

[fa1eb31fca] Peter Zhu 2023-02-24 21:10:54 UTC

3e098224077e8c43a1d8c2070b26ffdfda422780 のフック実行時に VM 命令が leaf かどうかで処理を変更するところのコメントをさらに詳しく書いています。またそれによると修正後のコードにも不具合というかあいまいなケースがあって、non-leaf な命令と leaf な命令が並んでいて今 pc が leaf な命令(後のほう)を指している場合、実際に実行されているのが non-leaf な前の命令で先に pc がインクリメントされた状態なのか、leaf な後の命令を実行していてまだ pc がインクリメントされていないのか両方の可能性があって見分けがつかないという問題があるそうです。うおーなるほどー。 pc のインクリメントタイミングが leaf かどうかでフックの前後どっちかが違っている以上はどうしようもないので、直すにはインクリメントタイミングをせめてフック実行をまたがないようにずらさないといけないけど他の影響がないか確認しないといけなくて大変そうですね。

[132934b82b] Alan Wu 2023-02-24 21:18:53 UTC

YJIT が VM スタックの inconsistency エラーで異常終了するコードを生成する不具合を修正しています。rb_iseq_pc_at_idx() の呼び出しで得たインデックスを使ってなかったのでうっかりミスの不具合みたいですね。 [ruby-core:112578] [Bug #19463]

[57bc3f2f46] Samuel Williams 2023-02-25 05:40:26 UTC

IO::Buffer.string というクラスメソッドを追加しています。引数に文字列サイズを受け取り、ブロックに文字列オブジェクトを wrap した IO::Buffer を渡して yield して、結果の文字列オブジェクトを返すというもので StringIO で IO として書き込んで結果の文字列を得るみたいな使いかたをするためのメソッドです。できた IO::Buffer をライブラリのメソッドの引数に渡したいみたいなことを考えるとブロックでしか使えないのちょっと不便な気がしますね。 https://github.com/ruby/ruby/pull/7364

[f94e83faa0] Samuel Williams 2023-02-25 06:27:11 UTC

Fiber local storage に値として nil を代入した時にキーを削除するようにしています。また Fiber.[] で参照するだけの時に不要にストレージ用の Hash オブジェクトを生成することがあったのを抑制するようにしています。 https://github.com/ruby/ruby/pull/7378

[d3ee9e590c] BurdetteLamar 2023-02-19 22:27:41 UTC

拡張ライブラリ stringio の rdoc 用コメントからちょっと前のドキュメントのポリシー変更で不要になった alias についての記述を削除しています。

[d0031db9b3] Samuel Williams 2023-02-25 10:04:10 UTC

57bc3f2f462df8e945ddfa5f9a8de45c1b0f0a86 で追加した IO::Buffer.string メソッドの実装で NUM2SIZET() マクロを利用していたのを RB_NUM2LONG() を利用するように変更しています。 https://github.com/ruby/ruby/pull/7379