Marshalling broken in Ruby 2.5.0 for Structs with keyword_init: true
Steps to reproduce:
irb(main):001:0> Foo = Struct.new(:foo) => Foo irb(main):002:0> Marshal.load(Marshal.dump(Foo.new('a'))) => #<struct Foo foo="a"> irb(main):003:0> Bar = Struct.new(:bar, keyword_init: true) => Bar(keyword_init: true) irb(main):004:0> Marshal.load(Marshal.dump(Bar.new(bar: 'a'))) Traceback (most recent call last): 3: from /home/jurriaan/.rubies/ruby-2.5.0/bin/irb:11:in `<main>' 2: from (irb):4 1: from (irb):4:in `load' ArgumentError (wrong number of arguments (given 1, expected 0))
I expected the keyword_init: true struct to unmarshal correctly.
This issue is caused by marshal.c calling the struct initializer with regular arguments instead of keyword arguments.
Updated by Hanmac (Hans Mackowiak) over 2 years ago
ah yeah i see the problem
comparing the dump of the two cases, the dump doesn't know that the struct might need keyword_init (might not need to know?)
the problem is that its hard coded and can't be overwritten by own dump/load methods
i think there need to be a check added if the struct wants keyword_init
Updated by k0kubun (Takashi Kokubun) over 2 years ago
- Status changed from Open to Closed