Bug #7348

marshaling an object by a float does not work

Added by Aaron Patterson over 1 year ago. Updated 7 months ago.

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

Description

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

def testmarshalobjectandfloat
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#testmarshalobjectandfloat = 0.00 s

1) Failure:
testmarshalobjectandfloat(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 Magnifier (556 Bytes) Aaron Patterson, 11/14/2012 09:20 AM

flonum_marshal_dump.patch Magnifier (954 Bytes) Tomoyuki Chikanaga, 11/16/2012 02:38 PM

Associated revisions

Revision 37687
Added by Tomoyuki Chikanaga over 1 year ago

  • marshal.c (w_object): add flonum to arg->data to keep reference index
    consistency. [Bug #7348]

  • test/ruby/test_marshal.rb: add a test for above.

Revision 42995
Added by Zachary Scott 7 months ago

  • ext/openssl/lib/openssl/ssl.rb: [DOC] Document OpenSSL::SSLServer Based on a patch by Rafal Lisowski [Bug #7348]

History

#1 Updated by Kenta Murata over 1 year 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.

#2 Updated by Shyouhei Urabe over 1 year ago

  • Status changed from Open to Assigned
  • Assignee set to Koichi Sasada

#3 Updated by Tomoyuki Chikanaga over 1 year ago

  • File flonum_marshal_dump.patchMagnifier added
  • Category set to core
  • Assignee changed from Koichi Sasada to 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).

#4 Updated by Tomoyuki Chikanaga over 1 year 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. [Bug #7348]

  • test/ruby/test_marshal.rb: add a test for above.

#5 Updated by Zachary Scott 7 months ago

commit miss orz

Also available in: Atom PDF