fix extraction of numbers into a 64-bit value on 32-bit platforms

This commit is contained in:
Matthew Flatt 2019-12-22 09:47:58 -07:00
parent 71fb5e0f6a
commit 41cc442779

View File

@ -380,7 +380,8 @@ int scheme_bignum_get_long_long_val(const Scheme_Object *o, mzlonglong *v)
} else if (SCHEME_BIGLEN(o) == 0) {
*v = 0;
return 1;
} else if (SCHEME_BIGDIG(o)[MAX_BN_SIZE_FOR_LL - 1] == FIRST_BIT_MASK_LL
} else if ((SCHEME_BIGLEN(o) == MAX_BN_SIZE_FOR_LL)
&& SCHEME_BIGDIG(o)[MAX_BN_SIZE_FOR_LL - 1] == FIRST_BIT_MASK_LL
# if !defined(USE_LONG_LONG_FOR_BIGDIG) && !defined(SIXTY_FOUR_BIT_INTEGERS)
&& !SCHEME_BIGDIG(o)[0]
# endif
@ -391,7 +392,8 @@ int scheme_bignum_get_long_long_val(const Scheme_Object *o, mzlonglong *v)
v2 = ((umzlonglong)v2 << 63);
*v = v2;
return 1;
} else if ((SCHEME_BIGDIG(o)[MAX_BN_SIZE_FOR_LL - 1] & FIRST_BIT_MASK_LL) != 0) { /* Won't fit into a signed long long */
} else if ((SCHEME_BIGLEN(o) == MAX_BN_SIZE_FOR_LL)
&& ((SCHEME_BIGDIG(o)[MAX_BN_SIZE_FOR_LL - 1] & FIRST_BIT_MASK_LL) != 0)) { /* Won't fit into a signed long long */
return 0;
} else {
mzlonglong v2;