ruby-trunk-changes 2023-04-07

今日は主に rb_gc_register_address() という C API の不具合修正と使いかたについてのコメントの追加などがありました。

[89bdf6e94c] Takashi Kokubun 2023-04-06 15:34:58 UTC

b7717fc390ce47c8ef24d2ed9fe25f188f28f60f で YJIT に導入した stack caching の最適化を arm64 アーキテクチャでも有効にしているようです。てっきり両方サポートしているのだと思ったけど x86_64 だけだったみたいですね。 https://github.com/ruby/ruby/pull/7659

[bccec7fb46] Peter Zhu 2023-04-06 14:25:59 UTC

gc.c の C API rb_gc_register_address() で引数のポインタが指す先のオブジェクトを RB_GC_GUARD() で GC から保護するようにしています。リストに追加するために ALLOC() を呼んだ時に GC が走るとその時点でまだ mark 対象のリストに追加されていないポインタが mark されず回収される可能性があったという不具合を修正。 [ruby-core:113153] [Bug #19584]

[bffadcd6d4] Peter Zhu 2023-04-06 17:35:25 UTC

GC.compact を使った ObjectSpace::WeakMap のテストを GC.compact がサポートされていない環境では skip するようにしています。

[fb822076d7] Hiroshi SHIBATA 2023-04-06 02:33:10 UTC

rubygems で文字列リテラルを複数行にまたいで書く時に String#+ を使わずにバックスラッシュによる行継続で文字列リテラルの連結機能を使うように書き換えています。 rubocop の警告抑制のため。

[5f8ebcada0] Nobuyoshi Nakada 2023-04-07 02:21:08 UTC

bccec7fb468ad977be75e7e4c2644b4ea845ab0c に関連して、起動時の ruby_init_loadpath() から呼んでいる rb_gc_register_address() の前に対象のアドレスに値を代入していたのを登録後に代入するようにしています。うーんこれはなぜだろう。ちゃんとした値を代入してから渡したほうが良さそうなものだけど、まあ実際にコンパイラがこの順序を保証するかはともかく、こうしていたら値の代入をするまではその値はスタックかレジスタには残っていることが保証されるので、rb_gc_register_address() で RB_GC_GUARD() しなくても mark 漏れしなくなるということですね。 [ruby-core:113153] [Bug #19584]

[e13575bb79] Nobuyoshi Nakada 2023-04-07 02:43:57 UTC

5f8ebcada099351acbc22db264e7cd3773c2bdc4 と同様に io.c や rubyspec の C API テスト用拡張ライブラリでも rb_gc_register_address() や rb_global_variable() といった GC mark 用にポインタを登録する関数を呼んだ後でその変数に値を代入するようにしています。 [ruby-core:113153] [Bug #19584]

[75a2dff0e0] Nobuyoshi Nakada 2023-04-07 02:54:25 UTC

5f8ebcada099351acbc22db264e7cd3773c2bdc4e13575bb7938e9e5b6a79bfca1b3793123f479da と同様に拡張ライブラリ openssl でも rb_global_variable() を呼んだ後にそこでアドレスを登録した変数に値を代入するようにしています。

[cc0b8c47bf] "dependabot[bot]" 2023-04-07 03:00:20 UTC

GitHub Actions の workflow で利用している github/codeql-action アクションのバージョンを更新しています。

[f99af43980] Nobuyoshi Nakada 2023-04-05 14:48:50 UTC

コンパイラによる thread local storage のための変数の修飾子が使えるかどうかの判定を __STDC_VERSION__ をみて判定していたのを configure で実際に試すようにしています。古い GCC で -std=gnu11 をつけると __STDC_VERSION__ は 201112 以上なのに _Thread_local はサポートされないという場合があって、RHEL でビルドできないことがあったようです。 [ruby-core:111075] [Bug #19161]

[4adcfc8cd7] Nobuyoshi Nakada 2023-04-07 03:25:20 UTC

rb_gc_register_address() のコメントに対象の変数に実際に mark が必要な VALUE の値を代入する前に呼ぶことという注釈を追加しています。また渡されたポインタの先の値が 0 または Qnil などの即値でなかったら警告とバックトレースを出すようにしています。いやー古くてメンテナンスされていない拡張ライブラリとかで困りそうだな。 [ruby-core:113153] [Bug #19584]

[250e97c0fb] Hiroshi SHIBATA 2023-04-07 00:15:17 UTC

rubygems で String#% を使ってたところを Kernel#format を使うように書き換えています。rubocop の警告抑制のため。

[f8115ec727] tomoya ishida 2023-04-07 11:03:23 UTC

irb のヒアドキュメントの文法解析をするテストで ripper の不具合を回避するための入力の変更をしています。 https://github.com/ruby/irb/pull/558