emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] feature/bignum d0fac17 18/24: Let C modules access bignum


From: Tom Tromey
Subject: [Emacs-diffs] feature/bignum d0fac17 18/24: Let C modules access bignum values
Date: Fri, 13 Jul 2018 00:25:09 -0400 (EDT)

branch: feature/bignum
commit d0fac17abdf6883bbf82b1752988db38d05282e6
Author: Tom Tromey <address@hidden>
Commit: Tom Tromey <address@hidden>

    Let C modules access bignum values
    
    * src/emacs-module.c (module_extract_integer, module_make_integer):
    Handle bignums.
---
 src/emacs-module.c | 20 +++++++++++++++++---
 1 file changed, 17 insertions(+), 3 deletions(-)

diff --git a/src/emacs-module.c b/src/emacs-module.c
index e781c38..7709eec 100644
--- a/src/emacs-module.c
+++ b/src/emacs-module.c
@@ -518,17 +518,31 @@ module_extract_integer (emacs_env *env, emacs_value n)
 {
   MODULE_FUNCTION_BEGIN (0);
   Lisp_Object l = value_to_lisp (n);
-  CHECK_FIXNUM (l);
+  CHECK_INTEGER (l);
+  if (BIGNUMP (l))
+    {
+      if (!mpz_fits_slong_p (XBIGNUM (l)->value))
+       xsignal1 (Qoverflow_error, l);
+      return mpz_get_si (XBIGNUM (l)->value);
+    }
   return XINT (l);
 }
 
 static emacs_value
 module_make_integer (emacs_env *env, intmax_t n)
 {
+  Lisp_Object obj;
   MODULE_FUNCTION_BEGIN (module_nil);
   if (FIXNUM_OVERFLOW_P (n))
-    xsignal0 (Qoverflow_error);
-  return lisp_to_value (env, make_fixnum (n));
+    {
+      mpz_t val;
+      mpz_init_set_si (val, n);
+      obj = make_number (val);
+      mpz_clear (val);
+    }
+  else
+    obj = make_fixnum (n);
+  return lisp_to_value (env, obj);
 }
 
 static double



reply via email to

[Prev in Thread] Current Thread [Next in Thread]