summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndy Wingo <wingo@pobox.com>2022-01-06 21:47:20 +0100
committerAndy Wingo <wingo@pobox.com>2022-01-13 09:37:17 +0100
commit9a91c20a551484f6a71bb35fa47b10f75f502c74 (patch)
tree2f2b0970ff8a38cc8c326399d39139cd265248fc
parentdebcccc2151831237c6eb283256a122b226003b4 (diff)
downloadguile-9a91c20a551484f6a71bb35fa47b10f75f502c74.tar.gz
scm_to_mpz uses integer lib
* libguile/integers.h: * libguile/integers.c (scm_integer_to_mpz_z): New internal function. * libguile/numbers.c (scm_to_mpz): Use new function.
-rw-r--r--libguile/integers.c9
-rw-r--r--libguile/integers.h3
-rw-r--r--libguile/numbers.c2
3 files changed, 12 insertions, 2 deletions
diff --git a/libguile/integers.c b/libguile/integers.c
index f00885792..0ca799b9e 100644
--- a/libguile/integers.c
+++ b/libguile/integers.c
@@ -3035,3 +3035,12 @@ scm_integer_to_uint64_z (struct scm_bignum *z, uint64_t *val)
{
return bignum_to_uint64 (z, val);
}
+
+void
+scm_integer_to_mpz_z (struct scm_bignum *z, mpz_t n)
+{
+ mpz_t zn;
+ alias_bignum_to_mpz (z, zn);
+ mpz_init_set (n, zn);
+ scm_remember_upto_here_1 (z);
+}
diff --git a/libguile/integers.h b/libguile/integers.h
index f8d150119..e48db1d17 100644
--- a/libguile/integers.h
+++ b/libguile/integers.h
@@ -32,7 +32,8 @@ scm_bignum (SCM x)
return (struct scm_bignum *) SCM_UNPACK (x);
}
-SCM_INTERNAL SCM scm_integer_from_mpz (mpz_srcptr mpz);
+SCM_INTERNAL SCM scm_integer_from_mpz (const mpz_t n);
+SCM_INTERNAL void scm_integer_to_mpz_z (struct scm_bignum *z, mpz_t n);
SCM_INTERNAL int scm_is_integer_odd_i (scm_t_inum i);
SCM_INTERNAL int scm_is_integer_odd_z (struct scm_bignum *z);
diff --git a/libguile/numbers.c b/libguile/numbers.c
index 10efb303a..330ea2cdd 100644
--- a/libguile/numbers.c
+++ b/libguile/numbers.c
@@ -7090,7 +7090,7 @@ scm_to_mpz (SCM val, mpz_t rop)
if (SCM_I_INUMP (val))
mpz_set_si (rop, SCM_I_INUM (val));
else if (SCM_BIGP (val))
- mpz_set (rop, SCM_I_BIG_MPZ (val));
+ scm_integer_to_mpz_z (scm_bignum (val), rop);
else
scm_wrong_type_arg_msg (NULL, 0, val, "exact integer");
}