DiffDaily

Deep & Concise - OSS変更の定点観測

[Rails] YJIT有効化時の`defined?`チェックを再追加

rails/rails

変更の背景

#56526で一度削除されたRubyVM::YJIT.enabledefined?チェックが再び追加されました。これは、古いバージョンの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バージョン間でより堅牢に動作します。