[Rails] YJIT有効化時の`defined?`チェックを再追加
rails/rails
変更の背景
#56526で一度削除されたRubyVM::YJIT.enableのdefined?チェックが再び追加されました。これは、古いバージョンのRuby(3.3未満)との互換性問題が報告されたためです。
YJITはRuby 3.1で導入されましたが、RubyVM::YJIT.enableメソッドはRuby 3.3以降でのみ利用可能です。defined?チェックなしでこのメソッドを呼び出すと、古いRubyバージョンでNameErrorが発生する可能性があります。
技術的な変更内容
変更前(#56526での変更)
initializer :enable_yjit do
if config.yjit
options = config.yjit.is_a?(Hash) ? config.yjit : {}
RubyVM::YJIT.enable(**options)
end
end
変更後(このリバート後)
initializer :enable_yjit do
if config.yjit && defined?(RubyVM::YJIT.enable)
options = config.yjit.is_a?(Hash) ? config.yjit : {}
RubyVM::YJIT.enable(**options)
end
end
互換性への影響
この変更により、以下のような動作が保証されます:
-
Ruby 3.3以降:
config.yjitが有効な場合、YJITが正常に有効化される -
Ruby 3.1-3.2:
defined?チェックにより、RubyVM::YJIT.enableが存在しない場合は静かにスキップされる - Ruby 3.0以前: YJITサポートがないため、同様にスキップされる
この防御的なプログラミングアプローチにより、Railsアプリケーションは異なるRubyバージョン間でより堅牢に動作します。