[ruby-core:121211] [Ruby master Feature#15393] Add compilation flags to freeze Array and Hash literals

Issue #15393 has been updated by shan (Shannon Skipper). tenderlovemaking (Aaron Patterson) wrote:
(Also I think maybe "frozen\_literals" would be a better name, but I don't want to imply that numbers or booleans are frozen too)
I just wanted to note it seems we have more and more literals frozen by default. The only literals that wouldn't be frozen with this patch would be percent literals, heredoc literals and stabby lambdas, I think? Could those be maybe frozen as well making `frozen_literals: true` entirely accurate I wonder? Frozen * Boolean literals * Nil literals * Numeric literals * Ranges literals * Regexp literals * String literals * Symbol literals Frozen with this patch * Array literals * Hash literals Unfrozen * Here docs literals * Lambda literals * Percent literals ---------------------------------------- Feature #15393: Add compilation flags to freeze Array and Hash literals https://bugs.ruby-lang.org/issues/15393#change-112152 * Author: tenderlovemaking (Aaron Patterson) * Status: Open ---------------------------------------- Hi, I would like to add VM compilation options to freeze array and hash literals. For example: ~~~ ruby 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 ~~~ Output is: ~~~ $ ./ruby thing.rb == disasm: #<ISeq:<compiled>@thing.rb:0 (0,0)-(0,34)> (catch: FALSE) 0000 putobject {"a"=>["b", {"c"=>"d"}]} 0002 leave ~~~ Anything nested in the hash that can't be "frozen" will cause it to not be frozen. For example: ~~~ ruby not_frozen = RubyVM::InstructionSequence.compile(<<-eocode, __FILE__, nil, 0, frozen_string_literal: true, frozen_hash_and_array_literal: true) { 'a' => some_method } eocode puts not_frozen.disasm ~~~ Output: ~~~ $ ./ruby thing.rb == disasm: #<ISeq:<compiled>@thing.rb:0 (0,0)-(0,24)> (catch: FALSE) 0000 putobject "a" 0002 putself 0003 opt_send_without_block <callinfo!mid:some_method, argc:0, FCALL|VCALL|ARGS_SIMPLE>, <callcache> 0006 newhash 2 0008 leave ~~~ Eventually I would like to freeze array and hash literals in source code itself, but I think this is a good first step. The reason I want this feature is I think we can reduce some object allocations, and once Guilds are implemented, easily create immutable data. I've attached a patch that implements the above. (Also I think maybe "frozen_literals" would be a better name, but I don't want to imply that numbers or booleans are frozen too) Thanks! -- https://bugs.ruby-lang.org/
participants (1)
-
shan (Shannon Skipper)