Project

General

Profile

Actions

Bug #7348

closed

marshaling an object by a float does not work

Added by tenderlovemaking (Aaron Patterson) over 11 years ago. Updated over 10 years ago.

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

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

  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.


Files

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 11 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) over 11 years ago

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

Updated by nagachika (Tomoyuki Chikanaga) over 11 years ago

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

Actions #4

Updated by nagachika (Tomoyuki Chikanaga) over 11 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 (zzak _) over 10 years ago

commit miss orz

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0