From 41cc4427792a7b42f95d66ecd6526ee9c590c8fe Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Sun, 22 Dec 2019 09:47:58 -0700 Subject: [PATCH] fix extraction of numbers into a 64-bit value on 32-bit platforms --- racket/src/racket/src/bignum.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/racket/src/racket/src/bignum.c b/racket/src/racket/src/bignum.c index 1c93bbd92a..88b9662923 100644 --- a/racket/src/racket/src/bignum.c +++ b/racket/src/racket/src/bignum.c @@ -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;