ruby-trunk-changes 2024-05-19

今日は parse.y のリファクタリングや Thread のコンテキスト切り替えの処理のレアな不具合の修正などがありました。

[232f7b37cf] Nobuyoshi Nakada 2024-05-18 10:46:05 UTC

parse.y で node の型に enum lex_state_e を追加して文字列リテラル内の式の埋め込みの開始である "#{" のトークンにこれを使うようにしています。 lexer の state をバックアップしておくためかな? また "->" による lambda 定義のトークンの型に num (int) を指定して不要なキャストを減らしています。そのほか各ルールの型を指定するキャストの位置をルールの末尾に書くように変更しています。

[fd8e6e8c54] Nobuyoshi Nakada 2024-05-18 15:27:34 UTC

232f7b37cf1e13d0fff6c8ffc8a342f1c126cd98 と同様に parse.y で node の型のキャストをルールの末尾に書くように変更するのと不要なキャストを消す変更続き。

[dbbaf871de] Nobuyoshi Nakada 2024-05-18 15:29:00 UTC

parse.y の特殊変数の lexer で $< についてのコメントの記述を修正しています。

[ad636033e2] Andrew Konchin 2024-05-09 17:35:01 UTC

spec/ruby に upstream から最新版をマージしています。

[7afc16aa48] KJ Tsanaktsidis 2024-05-18 09:37:49 UTC

thread.c の blocking_region_begin() 内で RB_VM_SAVE_MACHINE_CONTEXT() と thread_sched_to_waiting() を呼んでいたものを呼び元の BLOCKING_REGION() マクロや rb_thread_call_with_gvl() の blocking_region_begin() 呼び出し後に移動しています。呼び出しの順序的にはあまり変化はないはずですが RB_VM_SAVE_MACHINE_CONTEXT() で stack pointer などの情報を保存する時に blocking_region_begin() という関数内の状態を保存してしまってたのでこの関数から return した後の状態では不正な stack pointer を復元してしまう場合があり、この状態で GC.compact による参照の移動の処理で不正なメモリアクセスが発生し得る状態があったようです。 [ruby-core:117905] [Bug #20493]