mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
Fix rb_fix_mul_fix on OpenBSD/mips64
This fixes invalid and inconsistent results for the Fixnum*Fixnum case where the result of the multiplication does not fit in 64-bit on OpenBSD/mips64. For example: $ for x in 1 23; do ruby31 -e 'p(54306000000000*86400)'; done 14409380628474329524 11410664325873689790 Cases where an argument was Bignum, as well as cases where the result of the multiplication fits in 64-bit are fine: $ for x in 1 23; do ruby31 -e 'p(54306000*86400)'; done 4692038400000 4692038400000 $ for x in 1 23; do ruby31 -e 'p(5430600000000000000000*86400)'; done 469203840000000000000000000 469203840000000000000000000 This was originally discovered by running the tests for the openssl gem on OpenBSD/mips64 and having one test fail for a date far in the future. I eventually traced this to the generic multiplication issue. The underlying cause is using the int128_t type. This avoids use of the int128_t type in this case, falling back to the slower conversion code, which in the overflow case, turns the Fixnums into Bignums, then performs the multiplication.
This commit is contained in:
parent
cd34f56d45
commit
fe6245b430
1 changed files with 1 additions and 1 deletions
|
@ -18,7 +18,7 @@
|
|||
#if HAVE_LONG_LONG && SIZEOF_LONG * 2 <= SIZEOF_LONG_LONG
|
||||
# define DLONG LONG_LONG
|
||||
# define DL2NUM(x) LL2NUM(x)
|
||||
#elif defined(HAVE_INT128_T)
|
||||
#elif defined(HAVE_INT128_T) && !(defined(__OpenBSD__) && defined(__mips64__))
|
||||
# define DLONG int128_t
|
||||
# define DL2NUM(x) (RB_FIXABLE(x) ? LONG2FIX(x) : rb_int128t2big(x))
|
||||
VALUE rb_int128t2big(int128_t n); /* in bignum.c */
|
||||
|
|
Loading…
Reference in a new issue