[Rails] YJIT有効化処理から不要な`defined?`チェックを削除
rails/rails
Context
Rails 8.0からRuby 3.3.0が最低要件となったことで、RubyVM::YJIT.enableメソッドは常に利用可能になりました。これまでRailsのイニシャライザでは、YJITを有効化する際にdefined?を使ってメソッドの存在確認を行っていましたが、この保護機構が不要になったため削除されました。
Ruby 3.3.0ではRubyVM::YJIT.enableが標準機能として追加され、実行時にYJITを有効化できるようになっています。Rails側のコードもこの変更に合わせて簡素化されました。
Technical Detail
変更内容
変更前:
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
変更後:
initializer :enable_yjit do
if config.yjit
options = config.yjit.is_a?(Hash) ? config.yjit : {}
RubyVM::YJIT.enable(**options)
end
end
Ruby 3.3.0での確認
Ruby 3.3.0以降では、RubyVM::YJIT.enableは常に定義されています:
$ ruby -ve 'p defined?(RubyVM::YJIT.enable)'
ruby 3.3.0 (2023-12-25 revision 5124f9ac75) [x86_64-linux]
"method"
YJITの設定方法
この変更後も、YJITの有効化方法に変更はありません。設定ファイルで以下のように指定できます:
# config/application.rb
config.yjit = true # デフォルトオプションで有効化
# または
config.yjit = { stats: true } # オプション付きで有効化
Impact
この変更は内部的なコード整理であり、Rails利用者の設定方法や挙動には影響しません。Ruby 3.3.0未満のバージョンではRailsが動作しなくなるため、defined?チェックが不要になりました。
コードの可読性が向上し、Rails 8.0がRuby 3.3.0以降を要求することが明確になります。