🙆

[Feature #15393] Array と Hash リテラルを frozen で定義するコンパイルオプショを追加する提案

2025/03/01に公開

[Feature #15393] Add compilation flags to freeze Array and Hash literals

  • ArrayHash リテラルを frozen で定義するコンパイルオプショを追加する提案
frozen = RubyVM::InstructionSequence.compile(<<-eocode, __FILE__, nil, 0, frozen_string_literal: true, frozen_hash_and_array_literal: true)
  { 'a' => ['b', { 'c' => 'd' }] }
eocode
puts frozen.disasm
$ ./ruby thing.rb
== disasm: #<ISeq:<compiled>@thing.rb:0 (0,0)-(0,34)> (catch: FALSE)
0000 putobject                    {"a"=>["b", {"c"=>"d"}]}
0002 leave
  • このチケットではまずは RubyVM から対応して将来的にはコードベースでも対応していきたい、って感じみたいですね
  • frozen_hash_and_array_literal という名前や単位が適切かどうかや #deep_freeze のようなメソッドで対応できないかどうかみたいな内容が議論されています
    • frozen_literals のような全部まとめた名前にするか frozen_array_literal frozen_hash_literal みたいに分けるか
    • #deep_freeze はモンキーパッチが当てられた場合に最適化するのが難しかったり #deep_freeze の呼び出しに依存しないほうが既存のコードで試しやすい、みたいな話があるみたいですね
  • 起票は6年前なんですが最近コメントされていたので取り上げましあ
GitHubで編集を提案

Discussion