diff options
author | Philipp Stephani <phst@google.com> | 2019-04-18 22:38:29 +0200 |
---|---|---|
committer | Philipp Stephani <phst@google.com> | 2019-04-24 12:53:54 +0200 |
commit | e290a7d1730c99010272bbff7f497c3041cef46d (patch) | |
tree | d17ccf1313e8b408c6e8cbef64e71a4f1311da4e /test | |
parent | bffceab6339fb4042588b893ef754c6264379e75 (diff) | |
download | emacs-e290a7d1730c99010272bbff7f497c3041cef46d.tar.gz |
Add module functions to convert from and to big integers.
* src/module-env-27.h: Add new module functions to convert big
integers.
* src/emacs-module.h.in (emacs_mpz): Define if GMP is available.
* src/emacs-module.c (module_extract_big_integer)
(module_make_big_integer): New functions.
(initialize_environment): Use them.
* test/data/emacs-module/mod-test.c (Fmod_test_double): New test
function.
(emacs_module_init): Define it.
* test/src/emacs-module-tests.el (mod-test-double): New unit test.
* doc/lispref/internals.texi (Module Values): Document new functions.
Diffstat (limited to 'test')
-rw-r--r-- | test/data/emacs-module/mod-test.c | 19 | ||||
-rw-r--r-- | test/src/emacs-module-tests.el | 7 |
2 files changed, 26 insertions, 0 deletions
diff --git a/test/data/emacs-module/mod-test.c b/test/data/emacs-module/mod-test.c index dbdbfecfe6a..85a7f28e50d 100644 --- a/test/data/emacs-module/mod-test.c +++ b/test/data/emacs-module/mod-test.c @@ -27,8 +27,11 @@ along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>. */ #include <string.h> #include <time.h> +#define EMACS_MODULE_GMP #include <emacs-module.h> +#include <gmp.h> + #include "timespec.h" int plugin_is_GPL_compatible; @@ -378,6 +381,21 @@ Fmod_test_add_nanosecond (emacs_env *env, ptrdiff_t nargs, emacs_value *args, return env->make_time (env, time); } +static emacs_value +Fmod_test_double (emacs_env *env, ptrdiff_t nargs, emacs_value *args, + void *data) +{ + assert (nargs == 1); + emacs_value arg = args[0]; + struct emacs_mpz value; + mpz_init (value.value); + env->extract_big_integer (env, arg, &value); + mpz_mul_ui (value.value, value.value, 2); + emacs_value result = env->make_big_integer (env, &value); + mpz_clear (value.value); + return result; +} + /* Lisp utilities for easier readability (simple wrappers). */ /* Provide FEATURE to Emacs. */ @@ -447,6 +465,7 @@ emacs_module_init (struct emacs_runtime *ert) NULL, NULL); DEFUN ("mod-test-sleep-until", Fmod_test_sleep_until, 2, 2, NULL, NULL); DEFUN ("mod-test-add-nanosecond", Fmod_test_add_nanosecond, 1, 1, NULL, NULL); + DEFUN ("mod-test-double", Fmod_test_double, 1, 1, NULL, NULL); #undef DEFUN diff --git a/test/src/emacs-module-tests.el b/test/src/emacs-module-tests.el index eea4c611655..78f238140da 100644 --- a/test/src/emacs-module-tests.el +++ b/test/src/emacs-module-tests.el @@ -338,4 +338,11 @@ Interactively, you can try hitting \\[keyboard-quit] to quit." (ert-info ((format "input: %s" input)) (should-error (mod-test-add-nanosecond input))))) +(ert-deftest mod-test-double () + (dolist (input (list 0 1 2 -1 42 12345678901234567890 + most-positive-fixnum (1+ most-positive-fixnum) + most-negative-fixnum (1- most-negative-fixnum))) + (ert-info ((format "input: %d" input)) + (should (= (mod-test-double input) (* 2 input)))))) + ;;; emacs-module-tests.el ends here |