diff options
author | Andy Wingo <wingo@pobox.com> | 2022-01-06 21:47:20 +0100 |
---|---|---|
committer | Andy Wingo <wingo@pobox.com> | 2022-01-13 09:37:17 +0100 |
commit | 9a91c20a551484f6a71bb35fa47b10f75f502c74 (patch) | |
tree | 2f2b0970ff8a38cc8c326399d39139cd265248fc /libguile | |
parent | debcccc2151831237c6eb283256a122b226003b4 (diff) | |
download | guile-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.
Diffstat (limited to 'libguile')
-rw-r--r-- | libguile/integers.c | 9 | ||||
-rw-r--r-- | libguile/integers.h | 3 | ||||
-rw-r--r-- | libguile/numbers.c | 2 |
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"); } |