Actions
Bug #19427
closedMarshal.load(source, freeze: true) doesn't freeze in some cases
Bug #19427:
Marshal.load(source, freeze: true) doesn't freeze in some cases
Description
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:
module M
end
object = Object.new
object.extend(M)
object = Marshal.load(Marshal.dump(object), freeze: true)
object.frozen? # => false
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
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
Actions