From: Benoit Daloze Date: 2018-12-10T14:07:07+01:00 Subject: [ruby-core:90404] Re: [Ruby trunk Feature#15393] Add compilation flags to freeze Array and Hash literals Interesting code :) But also inefficient of course, making extra copies (changing identity) and allocations. On Mon, Dec 10, 2018 at 1:55 AM wrote: > > Issue #15393 has been updated by shyouhei (Shyouhei Urabe). > > > Off topic: > > Eregon (Benoit Daloze) wrote: > > One alternative idea which would achieve a similar goal is having #deep_freeze on core types, and recognizing `{ 'a' => ['b', { 'c' => 'd' }] }.deep_freeze`. > > This would be more general, since it would also work for freezing non-constant/non-literal data structures. > > Object#deep_freeze can be written without any extensions right now, like this: https://github.com/shyouhei/optdown/blob/master/lib/optdown/deeply_frozen.rb > I heard this trick from @akr . > > ---------------------------------------- > Feature #15393: Add compilation flags to freeze Array and Hash literals > https://bugs.ruby-lang.org/issues/15393#change-75509 > > * Author: tenderlovemaking (Aaron Patterson) > * Status: Open > * Priority: Normal > * Assignee: > * Target version: > ---------------------------------------- > 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: #@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: #@thing.rb:0 (0,0)-(0,24)> (catch: FALSE) > 0000 putobject "a" > 0002 putself > 0003 opt_send_without_block , > 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! > > ---Files-------------------------------- > 0001-Add-compile-options-for-freezing-hash-and-array-lite.patch (6.14 KB) > > > -- > https://bugs.ruby-lang.org/ > > Unsubscribe: > Unsubscribe: