summaryrefslogtreecommitdiff
path: root/libguile/numbers.c
diff options
context:
space:
mode:
authorMark H Weaver <mhw@netris.org>2016-04-06 17:36:57 -0400
committerAndy Wingo <wingo@pobox.com>2017-03-01 19:08:42 +0100
commit1d257c27f004fe4db81d62033b5cf2d8fafcd68f (patch)
treeb411ac6606fa9f64e502d51e59e9a6b042a7f785 /libguile/numbers.c
parenta8d1c7d61018bb2c77c6ffd57f3c1672361ce1e9 (diff)
downloadguile-1d257c27f004fe4db81d62033b5cf2d8fafcd68f.tar.gz
Do not assume that sizeof (long) == sizeof (void *) == sizeof (SCM).
This assumption does not hold on systems that use the LLP64 data model. Partially fixes <https://debbugs.gnu.org/22406>. Reported by Peter TB Brett <peter@peter-b.co.uk>. * libguile/numbers.h (scm_t_inum): Move here from numbers.c, and change to be equivalent to 'long' (formerly 'scm_t_signed_bits'). (SCM_MOST_POSITIVE_FIXNUM, SCM_MOST_NEGATIVE_FIXNUM): Define based on SCM_I_FIXNUM_BIT instead of SCM_T_SIGNED_BITS_MAX. (SCM_I_INUM): Adjust definitions to return a 'scm_t_inum', and avoiding the assumption that SCM_UNPACK returns a 'long'. * libguile/numbers.c (scm_t_inum): Move definition to numbers.h. Verify that 'scm_t_inum' fits within a SCM value. (scm_i_inum2big): Remove preprocessor code that forced a compile error unless sizeof (long) == sizeof (void *).
Diffstat (limited to 'libguile/numbers.c')
-rw-r--r--libguile/numbers.c10
1 files changed, 3 insertions, 7 deletions
diff --git a/libguile/numbers.c b/libguile/numbers.c
index 34980c6a9..3e0efc8bb 100644
--- a/libguile/numbers.c
+++ b/libguile/numbers.c
@@ -86,7 +86,9 @@
/* FIXME: We assume that FLT_RADIX is 2 */
verify (FLT_RADIX == 2);
-typedef scm_t_signed_bits scm_t_inum;
+/* Make sure that scm_t_inum fits within a SCM value. */
+verify (sizeof (scm_t_inum) <= sizeof (scm_t_bits));
+
#define scm_from_inum(x) (scm_from_signed_integer (x))
/* Test an inum to see if it can be converted to a double without loss
@@ -271,13 +273,7 @@ scm_i_inum2big (scm_t_inum x)
{
/* Return a newly created bignum initialized to X. */
SCM z = make_bignum ();
-#if SIZEOF_VOID_P == SIZEOF_LONG
mpz_init_set_si (SCM_I_BIG_MPZ (z), x);
-#else
- /* Note that in this case, you'll also have to check all mpz_*_ui and
- mpz_*_si invocations in Guile. */
-#error creation of mpz not implemented for this inum size
-#endif
return z;
}