1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-04-30 03:40:34 +02:00

Fix bug when making mpz from 0

* libguile/integers.c (make_bignum_0): New helper.
(make_bignum_from_uint64):
(ulong_to_bignum):
(long_to_bignum): Call new helper as appropriate.
This commit is contained in:
Andy Wingo 2022-01-07 22:15:23 +01:00
parent 443d239828
commit eac47c3e45

View file

@ -174,6 +174,12 @@ negate_bignum (struct scm_bignum *z)
return z; return z;
} }
static struct scm_bignum *
make_bignum_0 (void)
{
return allocate_bignum (0);
}
static struct scm_bignum * static struct scm_bignum *
make_bignum_1 (int is_negative, mp_limb_t limb) make_bignum_1 (int is_negative, mp_limb_t limb)
{ {
@ -200,7 +206,7 @@ make_bignum_from_uint64 (uint64_t val)
if (val > UINT32_MAX) if (val > UINT32_MAX)
return make_bignum_2 (0, val, val >> 32); return make_bignum_2 (0, val, val >> 32);
#endif #endif
return make_bignum_1 (0, val); return val == 0 ? make_bignum_0 () : make_bignum_1 (0, val);
} }
static struct scm_bignum * static struct scm_bignum *
@ -214,7 +220,7 @@ make_bignum_from_int64 (int64_t val)
static struct scm_bignum * static struct scm_bignum *
ulong_to_bignum (unsigned long u) ulong_to_bignum (unsigned long u)
{ {
return make_bignum_1 (0, u); return u == 0 ? make_bignum_0 () : make_bignum_1 (0, u);
}; };
static struct scm_bignum * static struct scm_bignum *
@ -223,7 +229,7 @@ long_to_bignum (long i)
if (i > 0) if (i > 0)
return ulong_to_bignum (i); return ulong_to_bignum (i);
return make_bignum_1 (1, long_magnitude (i)); return i == 0 ? make_bignum_0 () : make_bignum_1 (1, long_magnitude (i));
}; };
static inline SCM static inline SCM