diff options
| author | Tom Tromey | 2018-07-07 22:51:58 -0600 |
|---|---|---|
| committer | Tom Tromey | 2018-07-12 22:12:28 -0600 |
| commit | d0fac17abdf6883bbf82b1752988db38d05282e6 (patch) | |
| tree | 020c1a2dd55a6a1bbd13cfbb1a805d34750f0fb9 | |
| parent | 8fb995b9e360270b6a4d7b7732a127a6234eba23 (diff) | |
| download | emacs-d0fac17abdf6883bbf82b1752988db38d05282e6.tar.gz emacs-d0fac17abdf6883bbf82b1752988db38d05282e6.zip | |
Let C modules access bignum values
* src/emacs-module.c (module_extract_integer, module_make_integer):
Handle bignums.
| -rw-r--r-- | src/emacs-module.c | 20 |
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 | ||
| 525 | static emacs_value | 531 | static emacs_value |
| 526 | module_make_integer (emacs_env *env, intmax_t n) | 532 | module_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 | ||
| 534 | static double | 548 | static double |