Project

General

Profile

Actions

Bug #7348

closed

marshaling an object by a float does not work

Added by tenderlovemaking (Aaron Patterson) about 10 years ago. Updated about 9 years ago.

Status:
Closed
Priority:
Normal
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) about 10 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 10 years ago

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

Updated by nagachika (Tomoyuki Chikanaga) about 10 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) about 10 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) about 9 years ago

commit miss orz

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0