Project

General

Profile

Actions

Bug #19427

closed

Marshal.load(source, freeze: true) doesn't freeze in some cases

Added by andrykonchin (Andrew Konchin) almost 2 years ago. Updated 6 months ago.


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

Related issues 1 (0 open1 closed)

Related to Ruby master - Feature #18148: Marshal.load freeze optionClosedActions
Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like1Like0