From 9a91c20a551484f6a71bb35fa47b10f75f502c74 Mon Sep 17 00:00:00 2001 From: Andy Wingo Date: Thu, 6 Jan 2022 21:47:20 +0100 Subject: [PATCH] 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. --- libguile/integers.c | 9 +++++++++ libguile/integers.h | 3 ++- 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"); }