From 1802ed17b367be95be5e9f562624ad518f35b1c3 Mon Sep 17 00:00:00 2001 From: Andy Wingo Date: Thu, 6 Jan 2022 21:12:50 +0100 Subject: [PATCH] Reimplement scm_{to,from}_{int64,uint64} * libguile/numbers.c (scm_to_int64, scm_from_int64, scm_to_uint64): (scm_from_uint64): Reimplement inline. --- libguile/numbers.c | 63 +++++++++++++++++++++++++++++++++------------- 1 file changed, 46 insertions(+), 17 deletions(-) diff --git a/libguile/numbers.c b/libguile/numbers.c index 22321ebb2..9ea860600 100644 --- a/libguile/numbers.c +++ b/libguile/numbers.c @@ -6996,7 +6996,7 @@ scm_to_uint32 (SCM arg) #if SCM_SIZEOF_LONG == 4 if (SCM_I_INUMP (arg)) { - if (SCM_I_INUM (arg) > 0) + if (SCM_I_INUM (arg) >= 0) return SCM_I_INUM (arg); } else if (SCM_BIGP (arg)) @@ -7027,6 +7027,51 @@ scm_from_uint32 (uint32_t arg) #endif } +int64_t +scm_to_int64 (SCM arg) +{ + if (SCM_I_INUMP (arg)) + return SCM_I_INUM (arg); + else if (!SCM_BIGP (arg)) + scm_wrong_type_arg_msg (NULL, 0, arg, "exact integer"); + int64_t ret; + if (scm_integer_to_int64_z (scm_bignum (arg), &ret)) + return ret; + range_error (arg, scm_integer_from_int64 (INT64_MIN), + scm_integer_from_int64 (INT64_MAX)); +} + +SCM +scm_from_int64 (int64_t arg) +{ + return scm_integer_from_int64 (arg); +} + +uint64_t +scm_to_uint64 (SCM arg) +{ + if (SCM_I_INUMP (arg)) + { + if (SCM_I_INUM (arg) >= 0) + return SCM_I_INUM (arg); + } + else if (SCM_BIGP (arg)) + { + uint64_t ret; + if (scm_integer_to_uint64_z (scm_bignum (arg), &ret)) + return ret; + } + else + scm_wrong_type_arg_msg (NULL, 0, arg, "exact integer"); + range_error (arg, 0, scm_integer_from_uint64 (UINT64_MAX)); +} + +SCM +scm_from_uint64 (uint64_t arg) +{ + return scm_integer_from_uint64 (arg); +} + #define TYPE scm_t_wchar #define TYPE_MIN (int32_t)-1 #define TYPE_MAX (int32_t)0x10ffff @@ -7035,22 +7080,6 @@ scm_from_uint32 (uint32_t arg) #define SCM_FROM_TYPE_PROTO(arg) scm_from_wchar (arg) #include "conv-integer.i.c" -#define TYPE int64_t -#define TYPE_MIN INT64_MIN -#define TYPE_MAX INT64_MAX -#define SIZEOF_TYPE 8 -#define SCM_TO_TYPE_PROTO(arg) scm_to_int64 (arg) -#define SCM_FROM_TYPE_PROTO(arg) scm_from_int64 (arg) -#include "conv-integer.i.c" - -#define TYPE uint64_t -#define TYPE_MIN 0 -#define TYPE_MAX UINT64_MAX -#define SIZEOF_TYPE 8 -#define SCM_TO_TYPE_PROTO(arg) scm_to_uint64 (arg) -#define SCM_FROM_TYPE_PROTO(arg) scm_from_uint64 (arg) -#include "conv-uinteger.i.c" - void scm_to_mpz (SCM val, mpz_t rop) {