Project

General

Profile

Bug #15551

The behavior of FIX2INT and FIX2UINT differs by platform

Added by Eregon (Benoit Daloze) 6 months ago. Updated 6 months ago.

Status:
Open
Priority:
Normal
Assignee:
-
Target version:
-
ruby -v:
ruby 2.4.5p335 (2018-10-18 revision 65137) [x64-mingw32]
[ruby-core:91192]

Description

For instance, when sizeof(int) < sizeof(long) (such as on Linux), then

FIX2INT(nil)

raises TypeError.
But when sizeof(int) == sizeof(long) (such as on Windows), then it returns 4.

So the behavior changes from a call to rb_fix2int() to a raw shift without any checks.
I think it should be consistent between platforms.

Also, the code in ruby.h defining FIX2INT is fairly complicated with conditions like #if SIZEOF_INT < SIZEOF_LONG
spanning many lines, which makes it fairly hard to follow.

See https://github.com/ruby/spec/blob/c661c0ba6a602be6e06768a319bd7d87b2a8eda6/optional/capi/fixnum_spec.rb
and https://ci.appveyor.com/project/eregon/spec-x948i/builds/21753809/job/ed8e8k97m8syp4r7 for more differences.

History

Updated by Eregon (Benoit Daloze) 6 months ago

FWIW, sizeof(int) == sizeof(long) is also the case on i686 Linux:
https://travis-ci.org/ruby/ruby/jobs/482143545

Also available in: Atom PDF