Bug #7348
closedmarshaling an object by a float does not work
Description
The below calls
object doesn't round trip through marshal on edge ruby:
def test_marshal_object_and_float
e = Object.new
calls = []
calls << [2.0, e]
calls << [e]
assert_equal calls, Marshal.load(Marshal.dump(calls))
end
When I run this test case, for some reason, the float takes the place of the object in the second array:
[36/82] TestMarshal#test_marshal_object_and_float = 0.00 s
- Failure:
test_marshal_object_and_float(TestMarshal) [/Users/aaron/git/ruby/test/ruby/test_marshal.rb:40]:
<[[2.0, #Object:0x007fa5c20b08a0], [#Object:0x007fa5c20b08a0]]> expected but was
<[[2.0, #Object:0x007fa5c20b05a8], [2.0]]>.
I've attached a failing test case.
Files
Updated by mrkn (Kenta Murata) about 12 years ago
irb(main):006:0> e = Object.new
irb(main):007:0> Marshal.load(Marshal.dump([[2.0e-100, e], [e]]))
=> [[2.0e-100, #Object:0x007fa45a10bc28], [#Object:0x007fa45a10bc28]]
Therefore it is related to flonum.
Updated by shyouhei (Shyouhei Urabe) about 12 years ago
- Status changed from Open to Assigned
- Assignee set to ko1 (Koichi Sasada)
Updated by nagachika (Tomoyuki Chikanaga) about 12 years ago
- File flonum_marshal_dump.patch flonum_marshal_dump.patch added
- Category set to core
- Assignee changed from ko1 (Koichi Sasada) to nagachika (Tomoyuki Chikanaga)
- Target version set to 2.0.0
hello,
I've investigated about this issue.
When flonum is introduced at r36798, flonum is treated as immediate value in w_object(), but is should treated as reference value.
I will attach a patch. This patch introduce a trivial incompatibility. All flonum of same value are dumped as reference of same Float object. I don't think this is not a practical problem.
(on flonum supported environment)
a = [2.0, 2.0, 2.0]
File.write("dump.txt", Marshal.dump(a))
(on flonum not supported environment)
a = Marshal.load(File.read("dump.txt"))
a.map{|f| f.object_id} # => [70180445290980, 70180445290980, 70180445290980]
If there's no objection, I'll check-in it tonight (in JST).
Updated by nagachika (Tomoyuki Chikanaga) about 12 years ago
- Status changed from Assigned to Closed
- % Done changed from 0 to 100
This issue was solved with changeset r37687.
Aaron, thank you for reporting this issue.
Your contribution to Ruby is greatly appreciated.
May Ruby be with you.
-
marshal.c (w_object): add flonum to arg->data to keep reference index
consistency. [ruby-core:49323] [Bug #7348] -
test/ruby/test_marshal.rb: add a test for above.