PROTECTED_IVARS 定数を freeze して Ractor セーフにする

rails/rails

Rails の内部で使用される PROTECTED_IVARS 定数に .freeze を付与し、Ractor 環境で安全に共有できるようにしました。

背景

PROTECTED_IVARS はビューへ流出させてはいけないインスタンス変数名のリストを保持しており、ActionMailer と ActionController の基底クラスで定義されています。これらは配列リテラルとして生成されるため変更可能であり、Ractor が要求する「不変(immutable)であること」を満たしていませんでした。Rubocop の指摘でこの点が見落とされていたことが判明し、Ractor に対応するための修正が必要となりました。

技術的な変更

actionmailer/lib/action_mailer/base.rbactionpack/lib/action_controller/base.rbPROTECTED_IVARS 定数定義の末尾に .freeze を付与しました。これにより、配列オブジェクトが生成時に凍結され、以降の変更が禁止されます。変更前後のコードは以下の通りです。

変更前:

PROTECTED_IVARS = AbstractController::Rendering::DEFAULT_PROTECTED_INSTANCE_VARIABLES + [:@_action_has_layout]

変更後:

PROTECTED_IVARS = (AbstractController::Rendering::DEFAULT_PROTECTED_INSTANCE_VARIABLES + [:@_action_has_layout]).freeze

変更前:

PROTECTED_IVARS = AbstractController::Rendering::DEFAULT_PROTECTED_INSTANCE_VARIABLES + %i(
  @_params @_response @_request @_config @_url_options @_action_has_layout @_view_context_class
  @_view_renderer @_lookup_context @_routes @_view_runtime @_db_runtime @_helper_proxy
  @_marked_for_same_origin_verification @_verify_authenticity_token_ran @_rendered_format
)

変更後:

PROTECTED_IVARS = (AbstractController::Rendering::DEFAULT_PROTECTED_INSTANCE_VARIABLES + %i(
  @_params @_response @_request @_config @_url_options @_action_has_layout @_view_context_class
  @_view_renderer @_lookup_context @_routes @_view_runtime @_db_runtime @_helper_proxy
  @_marked_for_same_origin_verification @_verify_authenticity_token_ran @_rendered_format
)).freeze

設計判断

freeze を利用した不変化は、既存の API を変更せずに安全性を向上させる最小限の侵入策です。新たにラッパークラスや深いコピーを導入するとパフォーマンスと可読性に影響が出る可能性がありますが、単に定数リテラルを凍結するだけで Ractor の共有オブジェクト要件を満たします。また、true/false のようなフラグと同様に定数は読み取り専用として扱われていたため、後方互換性に問題は生じません。

まとめ

PROTECTED_IVARS を凍結することで、ActionMailer と ActionController が内部で保持する保護対象変数リストが Ractor 環境でも安全に共有可能になり、マルチスレッド・マルチプロセスの実行モデルへの適合性が向上しました。最小限のコード変更で済むこのアプローチは、Rails の設計哲学である「シンプルで破壊的でない拡張」を体現しています。

記事メタデータ

Generated by:
gpt-oss-120b for DiffDaily
LLM Trace:
3226ac45

この記事はAIによって自動生成されています。内容の正確性については、必ずソースコードやPRを確認してください。

品質レビュー結果

Review Status:
承認済み
Review Count:
1回
Reviewed by:
gpt-oss-120b for DiffDaily

Review Criteria:

記事構成 ✓ PASS

Title, Context, Technical Detailの存在と明確さ

リード文、背景、技術的変更、設計判断、まとめが揃っており、総論→各論→結論の構成が明確です。

カスタムMarkdown構文 ✓ PASS

シンタックスハイライト・GitHubリンク記法の正確性

ファイル名付きシンタックスハイライトが正しい形式で使用され、PRリンクも #57851 の形式で正しくリンク化されています。

対象読者への適合性 ✓ PASS

エンジニア向けの適切な技術レベルと表現

Rails 開発者向けの専門的な内容で、不要な初心者向け説明はありません。

パラグラフ・ライティング ✓ PASS

トピックセンテンス・1段落1トピック・段落長

各セクションが総論・各論・結論のパラグラフで構成され、トピックセンテンスで始まり、1段落1トピック、段落長も適切です。

Diff内容との照合 ✓ PASS

コードブロックとDiff内容の一致

記事中のコードブロックは提供された Diff と完全に一致し、変更箇所と .freeze の追加が正確に反映されています。

技術用語の正確性 ✓ PASS

技術用語の正確な使用

PROTECTED_IVARS、Ractor、freeze などの用語が正しく使用されています。

説明の技術的正確性 ✓ PASS

技術的主張の正確性と論理性

技術的な説明は Diff と PR の記述に基づいており、誤りや根拠のない主張はありません。

事実の突合 ✓ PASS

PR情報による主張の裏付け(ハルシネーション検出)

すべての主張が PR のタイトル、説明、Diff で裏付けられており、ハルシネーションは検出されません。

数値・固有名詞の確認 ✓ PASS

PR番号・コミットID・バージョン等の正確性

PR 番号 #57851 が正しく記載されており、他の数値・固有名詞の誤りはありません。

タイトル・説明との一致 ✓ PASS

記事タイトル・説明とPR内容の一致

記事タイトルは PR の内容「Make protected ivars ractor safe」を日本語で適切に表現しています。

外部知識の正確性 ✓ PASS

PRに記載のない外部知識(LTS、サポート状況など)の不使用

バージョンサポートやリリース日程等、PR に記載されていない外部知識は含まれていません。

時間表現の正確性 ✓ PASS

時間表現がPR情報と一致しているか

時間表現の不一致はなく、PR の記述と合致しています。