ruby-trunk-changes 2023-12-10

今日は Thread のライフライクルイベントフックの Ractor や M:N Thread 対応やメソッドの keyword rest 引数とブロック引数の変換の処理順の修正などがありました。

[b2ad4fec1a] John Hawthorn 2023-12-09 05:16:02 UTC

デバッグ用の Thread のライフサイクルのイベントフックを複数 Ractor 利用時や M:N Thread で user-thread が切り替わるタイミングでの呼び出しを追加しています。 [ruby-core:115465] [Bug #20019] 一度 85bc80a51be0ceedcc57e7b6b779e6f8f885859e で revert された変更のリトライですね。フック呼び出しの追加が 1つ増えています。

[9e09e5aa3a] John Hawthorn 2023-12-09 19:33:36 UTC

b2ad4fec1a369e1cbd0c65d52062946a4fbfb84b で追加したテストにタイミング問題を避けるための sleep を追加しています。

[c0b6ea7c8b] KJ Tsanaktsidis 2023-12-08 23:55:12 UTC

compaction に関するテストで確実性のために生成するオブジェクト数を増やしています。

[a950f23078] Jeremy Evans 2023-11-08 23:56:53 UTC

メソッド呼び出しへの m(**kw, &blk) のような keyword rest とブロック引数を渡した呼びかたをした時に kw.to_hash と blk.to_proc の呼び出しによる変換が行われる順序を kw.to_hash → blk.to_proc の順になるようにしているそうです。このために新たな VM 命令 splatkw というのを追加して ISeq へのコンパイル時に必要に応じてこの命令を send の前に差し込むようにしています。なるほど確かに引数の評価は順に行われると無意識に想定しているし細かいことを言うと決まってないといけないのですが VM 命令まで必要になるとは。ちょっと苦肉の策という感じがしますね。

[f64357540e] Jeremy Evans 2023-12-07 20:16:09 UTC

a950f230788d51e13d16596e37cb77e4cc6e2311 の続きで super(**kw, &blk) のような super の呼び出しでも kw の to_hash での変換のほうが先に行われるように splatkw 命令を挿入しています。

[130268e264] Stan Lo 2023-12-10 04:21:41 UTC

irb の組み込みコマンド show_source のオプション処理などのリファクタリングhttps://github.com/ruby/irb/pull/807

[6e8ad7497e] Nobuyoshi Nakada 2023-12-10 04:55:19 UTC

template/GNUmakefile.in で DOT_WAIT 変数を定義するのを Makefile を include する前に移動しています。 Makefile 内で DOT_WAIT を利用するため。

[aecbd66742] KJ Tsanaktsidis 2023-11-19 11:54:01 UTC

include/ruby/atomic.h に RUBY_ATOMIC_LOAD()、RUBY_ATOMIC_PTR_LOAD() といった rb_atomic_t や void* の取得のマクロとその実装の inline 関数を追加しています。 [ruby-core:115307] [Bug #19994]

[f8effa209a] KJ Tsanaktsidis 2023-11-19 11:54:57 UTC

finalizer で GC 中に実行できない処理を後で実行するための postponed_job の機構で rb_postponed_job_register() の実装に不具合があり異常終了がまれに起きるのですが、それをパフォーマンスへの影響を小さくしつつ修正するのが難しいとのことで、機能を制限して rb_postponed_job_preregister() という関数でまずコールバック関数を登録して rb_postponed_job_handle_t という型の ID を取得しておいてから rb_postponed_job_trigger() でその ID を元にコールバックを呼ぶという仕組みにすることで ID の部分を atomic に操作することで race condition を避けるようにしています。ruby 本体で利用しているところはこの新しい API を使うように書きかえ、外部向けには rb_postponed_job_register() は rb_postponed_job_preregister()+rb_postponed_job_trigger() を連続して呼ぶ実装で deprecated にマークしつつ互換性のために残しています。 [ruby-core:115286] [Bug #19991]

[c4c39082af] Koichi Sasada 2023-12-09 16:47:14 UTC

f8effa209adb3ce050c100ffaffe6f3cc1508185 で追加された C API rb_postponed_job_preregister() に第1引数に flags というのを追加しています。未使用ですが将来の拡張のためとのこと。 [ruby-core:115286] [Bug #19991]

[0096d6a809] Nobuyoshi Nakada 2023-12-09 14:58:21 UTC

tool/lib/colorize.rb の色名を決めるメソッドを切り出すリファクタリング

[d9dbcd848f] Nobuyoshi Nakada 2023-12-09 15:14:10 UTC

tool/lib/colorize.rb の色指定のテーブルに bright_xxx の色名を追加しています。また ";" で複数の文字の属性の指定もできるようにしています。