Project

General

Profile

Actions

Misc #21110

open

Should Marshal.dump always use object links for repeated Float values?

Added by andrykonchin (Andrew Konchin) 2 days ago. Updated 2 days ago.

Status:
Open
Assignee:
-
[ruby-core:120869]

Description

I've noticed (during the downstreaming ruby/spec in https://github.com/ruby/ruby/pull/12679) that a repeated Float value may be dumped "directly"/"immediately" without an object link on x86 architecture, and with a link in other cases. It seems it depends on whether Float is Flonum or not.

amd64:

Marshal.dump([0.0, 0.0]) # => "\x04\b[\af\x060@\x06", where @\x06 is an object link

i686:

Marshal.dump([0.0, 0.0]) # => "\x04\b[\af\x060f\x060", so f\x060 is dumped twice

Both dumps are loaded correctly, so it seems there is no any compatibility issue.

Should dumping be consistent and don't depend on architecture?

From https://github.com/ruby/ruby/pull/12679#discussion_r1937116017

Updated by Eregon (Benoit Daloze) 2 days ago

IMO Marshal should not depend on obscure implementation details like Flonum, i.e. Float whether fitting in a Flonum or not should be dumped the same with Marshal.
What do others think?

Actions #2

Updated by Eregon (Benoit Daloze) 2 days ago

  • Description updated (diff)

Updated by nobu (Nobuyoshi Nakada) 2 days ago

I agree that Marshal should not depend on the details.
At least, Float should be distinguished only by its value, not its object ID.

OTOH, dump of Float is often longer:

Marshal.dump(Math.log(324.0)) #=> "\x04\bf\x165.780743515792329"

So it may use with a link just for deduplication, I think.

Updated by Eregon (Benoit Daloze) 2 days ago

Right, I think always adding a link makes sense.
Then the logic for flonum/not-flonum should be identical (as shown here).

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0