Project

General

Profile

Bug #19427

Updated by andrykonchin (Andrew Konchin) almost 2 years ago

I've noticed that the `freeze` option doesn't work in the following cases: 
 - when dumped object extends a module 
 - when dumped object responds to `#marshal_dump` and `#marshal_load` methods 
 - when dumped object responds to `#_dump` method 

 Is it expected behaviour or maybe a known issue? 

 Examples: 

 ```ruby 
 module M 
 end 

 object = Object.new 
 object.extend(M) 

 object = Marshal.load(Marshal.dump(object), freeze: true) 
 object.frozen? # => false 
 ``` 

 ```ruby 
 class UserMarshal 
   attr_accessor :data 

   def initialize 
     @data = 'stuff' 
   end 
   def marshal_dump() :data end 
   def marshal_load(data) @data = data end 
 end 

 object = Marshal.load(Marshal.dump(UserMarshal.new), freeze: true) 
 object.frozen? # => false 
 ``` 

 ```ruby 
 class UserDefined 
   attr_reader :a, :b 

   def initialize 
     @a = 'stuff' 
     @b = @a 
   end 

   def _dump(depth) 
     Marshal.dump [:stuff, :stuff] 
   end 

   def self._load(data) 
     a, b = Marshal.load data 

     obj = allocate 
     obj.instance_variable_set :@a, a 
     obj.instance_variable_set :@b, b 

     obj 
   end 
 end 

 object = Marshal.load(Marshal.dump(UserDefined.new), freeze: true) 
 object.frozen? # => false 
 ```

Back