今日は String のメソッドでメソッド内で receiver などが破壊的変更された時の異常終了を防ぐための修正群や、prepend された Module 内のメソッドを alias する時の deprecated 警告の追加などがありました。
拡張ライブラリ io/console で ttyname_r(3) の戻り値の型を extconf.rb でチェックして char* が返される時にエラーチェックを errno を使うように古い実装対応のマクロ定義を追加して差異を吸収するようにしています。
拡張ライブラリ io/console のバージョンを 0.9.4 に更新しています。
NEWS の default gems のバージョンリストの io-console のバージョンも 0.9.4 に更新しています。
複数 Ractor 対応時に require 用に gem を activate するための Ractor._activated というメソッドで無名モジュールを作成して Module#prepend で require を差し替えていたのを Object.module_eval で alias を作るという方法に切り替えています。 Rails の CI でエラーが発生していたみたいです。 [ruby-core:126497] [Bug #22263]
Ractor 間でのオブジェクトのコピーのための内部的な serializer のための struct rb_ractor_courier 構造体でオブジェクトの参照ツリーの構築のための処理で Hash の key に重複したオブジェクトが含まれていた時の処理に不具合があったのを修正しているみたいです。独自 Marshal みたいなのが導入されてたんですね。
同じく Ractor 間のオブジェクトコピーのための ractor courier で正規表現オブジェクト Regexp の複製処理を追加しています。
同じく Ractor 間のオブジェクトコピーのための ractor courier で Marshal が使う marshal_dump/marshal_load や _dump/_load, _dump_data/_load_data などのメソッドが定義されていたらこれを利用するようにしています。
同じく Ractor 間のオブジェクトコピーのための ractor courier で Marshal の dump の実装を流用するようにしているみたいです。このために rb_marshal_compat_lookup() という内部 API を追加しています。
同じく Ractor 間のオブジェクトコピーのための ractor courier で Marshal の実装を流用できるようになったために不要になった明示的な Marshal 利用のパスをしています。
同じく Ractor 間のオブジェクトコピーのための ractor courier で特異クラスを持つオブジェクトは特いクラスを無視してコピーするようにしています。
String#tr の Hash 引数対応の assertion の条件の間違いを修正。
ZJIT の Rust 実装の cfp->sp の設定の不具合修正。
ZJIT の Rust 実装の cfp->block_code の設定の不具合修正。
ZJIT の Rust 製テストのリファクタリング。
ZJIT の複数 Ractor 利用時のインスタンス変数の参照を JIT サポートする最適化。
Ruby::Box 利用時にグローバル変数に代入しても defined? での評価が nil になっていたのを修正しています。
Array#pack で指示子 r/R の処理で to_int メソッドによる変換呼び出し中に buffer で指定された文字列オブジェクトが破壊的変更されると異常終了する可能性があったのを RSTRING_LEN() を取り直すようにして修正しています。
GitHub Actions の ModGC のテストの workflow でタイムアウトを伸ばしています。
rubygems のテスト用のダミーサーバーの socket 通信で捕捉する例外に Errno::ECONNABORTED, Errno::ECONNRESET を追加しています。
rubygems のテストのダミーサーバーの捕捉例外クラスの追加。
rubygems の WebAuthN 対応で OTP 取得のレスポンスが得られなかった時に例外で落ちてしまっていたのを例外捕捉して次の接続を待つようにしています。
テスト用の test/unit でメソッド再定義時に alias で元メソッドを退避していたのをやめています。今後追加される警告抑制のため。
T_DATA 型オブジェクトの dfree 関数の呼び出しを遅延させて Ractor ごとのリストに溜めておいて一定サイズごとに VM barrier で Ractor の動作を止めてまとめて解放するようにしています。
rubygems で Gem::Installer#verify_spec で spec.version のパターンをチェックして不正なスクリプトが gemspec に埋め込まれるのを防ぐようにしています。
bundler の man ページおよび help メッセージの --major オプションの説明を修正しています。
rubygems と bundler の不要になった古い ruby 向けの対応を削除しています。
rubygems および bundler の古い openssl のバージョンの対応を削除しています。
rubygems の古い psych のバージョンに対応するための workaround を削除しています。
GitHub Actions の workflows で利用しているアクションのバージョンを更新しています。
NEWS の default gems の更新履歴を更新しています。
rubygems で URL に不正な文字列が指定された時に NoMethodError でエラーになり本来のエラーが発生しない不具合を修正しています。
rubygems の Gem::RemoteFetcher#fetch_http でリダイレクト処理、Location ヘッダの扱いの不具合などを compact_index_client と揃えるよう修正しています。
String#encode のコールバックの Proc から receiver の文字列オブジェクトが破壊的変更が行われると異常終了する可能性があった不具合を RSTRING_PTR()/RSTRING_LEN() を取り直して変更がないかチェックして例外発生させるようにして対処しています。 [ruby-core:126760] [Bug #22330]
GC の defaualt GC で finalizer の管理用リストの操作で Ractor Local GC の導入で VM lock が不要になってたので削除しています。
String#[]= で引数の to_str での変換時に receiver の文字列オブジェクトを破壊的変更すると異常終了する可能性があったので RSTRING_LEN() を再取得してチェックして変化してたら例外発生させるようにしています。
rubygems の Ruby::Box 利用時に $stdout/$stderr の利用ができないために skip していたテストを復活させています。
rubygems の Gem::AtomicFileWriter で vendored_securerandom を require する際に defined? で定数の存在チェックしていたのをやめています。他の Thread でロード中の時に中途半端な Gem::SecureRandom が見えてしまう可能性があるので require/load の排他処理にまかせるようにしています。
sync モードの IO で IO#write に複数の引数を渡した時に IOV_MAX を越えているとバッファに残したままになっていたので、sync モードの動作をさせるため flush しておくようにしています。 この関数(io_binwritev())内では sync モードの分岐はないですが、そもそもこの関数の呼び元は 1つで、そこにくるのは sync モードの時だけなので無条件で flush してもいいということみたいでした。 https://github.com/ruby/ruby/pull/18905
String#slice! でも引数の to_int メソッドでの変換呼び出し時に receiver の文字列オブジェクトが破壊的変更が行なわれると異常終了する可能性があったので変換後に RSTRING_LEN() を再取得するように修正しています。
string.c の String#tr の SIMD 対応まわりの未初期化変数の警告の誤検出の抑制のため、ループカウンタのローカル変数への代入を追加しています。
同じく String#tr の SIMD 命令対応でループ上限を格納する変数の型を unsigned にして不要な assertion を削除しています。
GC の mmtk 実装の NoGC 実装利用時に環境変数 MMTK_HEAP_MODE の "cpu" や "ruby" という指定は無意味なので "fixed" に fallback させています。
rb_class_inherited_p()、rb_class_superclass()、rb_intern_const() の 3つの関数の prototype 宣言に RBIMPL_ATTR_PURE() という attribute 指定のマクロを使っていたのですが、これらの関数は副作用をもっているため RBIMPL_ATTR_NOALIAS() に変更しています。 [ruby-core:126742] [Bug #22324]