Bug #7348


marshaling an object by a float does not work

Added by tenderlovemaking (Aaron Patterson) over 9 years ago. Updated almost 9 years ago.

Target version:
ruby -v:
ruby 2.0.0dev (2012-11-14 trunk 37650) [x86_64-darwin12.2.1]


The below calls object doesn't round trip through marshal on edge ruby:

def test_marshal_object_and_float
e =
calls = []
calls << [2.0, e]
calls << [e]
assert_equal calls, Marshal.load(Marshal.dump(calls))

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

  1. 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.


marshal_fail.patch (556 Bytes) marshal_fail.patch tenderlovemaking (Aaron Patterson), 11/14/2012 09:20 AM
flonum_marshal_dump.patch (954 Bytes) flonum_marshal_dump.patch nagachika (Tomoyuki Chikanaga), 11/16/2012 02:38 PM

Updated by mrkn (Kenta Murata) over 9 years ago

irb(main):006:0> e =
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) over 9 years ago

  • Status changed from Open to Assigned
  • Assignee set to ko1 (Koichi Sasada)

Updated by nagachika (Tomoyuki Chikanaga) over 9 years ago


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("dump.txt")){|f| f.object_id} # => [70180445290980, 70180445290980, 70180445290980]

If there's no objection, I'll check-in it tonight (in JST).

Actions #4

Updated by nagachika (Tomoyuki Chikanaga) over 9 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.

Updated by zzak (Zachary Scott) almost 9 years ago

commit miss orz


Also available in: Atom PDF