aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorTom Tromey2018-07-07 22:51:58 -0600
committerTom Tromey2018-07-12 22:12:28 -0600
commitd0fac17abdf6883bbf82b1752988db38d05282e6 (patch)
tree020c1a2dd55a6a1bbd13cfbb1a805d34750f0fb9 /src
parent8fb995b9e360270b6a4d7b7732a127a6234eba23 (diff)
downloademacs-d0fac17abdf6883bbf82b1752988db38d05282e6.tar.gz
emacs-d0fac17abdf6883bbf82b1752988db38d05282e6.zip
Let C modules access bignum values
* src/emacs-module.c (module_extract_integer, module_make_integer): Handle bignums.
Diffstat (limited to 'src')
-rw-r--r--src/emacs-module.c20
1 files changed, 17 insertions, 3 deletions
diff --git a/src/emacs-module.c b/src/emacs-module.c
index e781c38f462..7709eeca94a 100644
--- a/src/emacs-module.c
+++ b/src/emacs-module.c
@@ -518,17 +518,31 @@ module_extract_integer (emacs_env *env, emacs_value n)
518{ 518{
519 MODULE_FUNCTION_BEGIN (0); 519 MODULE_FUNCTION_BEGIN (0);
520 Lisp_Object l = value_to_lisp (n); 520 Lisp_Object l = value_to_lisp (n);
521 CHECK_FIXNUM (l); 521 CHECK_INTEGER (l);
522 if (BIGNUMP (l))
523 {
524 if (!mpz_fits_slong_p (XBIGNUM (l)->value))
525 xsignal1 (Qoverflow_error, l);
526 return mpz_get_si (XBIGNUM (l)->value);
527 }
522 return XINT (l); 528 return XINT (l);
523} 529}
524 530
525static emacs_value 531static emacs_value
526module_make_integer (emacs_env *env, intmax_t n) 532module_make_integer (emacs_env *env, intmax_t n)
527{ 533{
534 Lisp_Object obj;
528 MODULE_FUNCTION_BEGIN (module_nil); 535 MODULE_FUNCTION_BEGIN (module_nil);
529 if (FIXNUM_OVERFLOW_P (n)) 536 if (FIXNUM_OVERFLOW_P (n))
530 xsignal0 (Qoverflow_error); 537 {
531 return lisp_to_value (env, make_fixnum (n)); 538 mpz_t val;
539 mpz_init_set_si (val, n);
540 obj = make_number (val);
541 mpz_clear (val);
542 }
543 else
544 obj = make_fixnum (n);
545 return lisp_to_value (env, obj);
532} 546}
533 547
534static double 548static double