Bootsnapがファイルを誤って旧パーサーで読み込むRubyバグに対処
Bootsnap 1.24.2では、RubyVM::InstructionSequence.compile_fileに存在するRubyのバグ2件を回避する対処が加えられました。このバグにより、一部のファイルがPrismパーサーではなく旧Rubyパーサーで読み込まれ、特定のパターンマッチング構文で問題が発生していました。
背景
RubyVM::InstructionSequence.compile_file に存在する2つのRubyバグが、Bootsnapのファイルロード処理に影響していました。Bootsnapはキャッシュ機構を通じてRubyファイルをコンパイル・ロードする際にこのAPIを使用しますが、そのバグによって本来Prismで処理されるべきファイルが旧来のRubyパーサーにフォールバックする現象が発生していました。詳細は Ruby Bug #22023 に報告されています。
Prismと旧パーサーでは構文の解釈が異なる場合があり、パターンマッチング構文など一部の構文でこの差異が問題として顕在化しました。パーサーの選択がキャッシュ層に起因する形で非決定的になることは、再現困難なバグの温床となります。
技術的な変更
CHANGELOGおよびバージョン番号の更新のみが今回のリリースに含まれており、コアとなる修正は本コミットより前に取り込まれています。lib/bootsnap/version.rb において VERSION が "1.24.1" から "1.24.2" へ更新されました。
変更前:
module Bootsnap
VERSION = "1.24.1"
end
変更後:
module Bootsnap
VERSION = "1.24.2"
end
CHANGELOGには、RubyVM::InstructionSequence.compile_file の2つのRubyバグに対するワークアラウンドが記載されており、パーサー選択の一貫性が回復したことが示されています。
まとめ
本リリースは、Rubyランタイムのバグに起因するパーサー選択の不整合をBootsnap層で吸収することで、パターンマッチング構文を含むコードの安定したロードを保証するものです。Prism移行期における互換性維持の観点から、Bootsnapがプラットフォームの不具合に対する緩衝層として機能する事例といえます。