[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Emacs-diffs] feature/bignum 0d86891 14/24: Make 1+ and 1- handle bignum
From: |
Tom Tromey |
Subject: |
[Emacs-diffs] feature/bignum 0d86891 14/24: Make 1+ and 1- handle bignums |
Date: |
Fri, 13 Jul 2018 00:25:08 -0400 (EDT) |
branch: feature/bignum
commit 0d868917efb46400cf7dd57a1cdbba7404f322a7
Author: Tom Tromey <address@hidden>
Commit: Tom Tromey <address@hidden>
Make 1+ and 1- handle bignums
* src/data.c (Fadd1, Fsub1): Handle bignums.
* test/src/data-tests.el (data-tests-1+, data-tests-1-): New tests.
---
src/data.c | 48 ++++++++++++++++++++++++++++++++++++++++++++----
test/src/data-tests.el | 8 ++++++++
2 files changed, 52 insertions(+), 4 deletions(-)
diff --git a/src/data.c b/src/data.c
index 18b572d..d717568 100644
--- a/src/data.c
+++ b/src/data.c
@@ -3239,12 +3239,32 @@ DEFUN ("1+", Fadd1, Sadd1, 1, 1, 0,
Markers are converted to integers. */)
(register Lisp_Object number)
{
- CHECK_FIXNUM_OR_FLOAT_COERCE_MARKER (number);
+ CHECK_NUMBER_COERCE_MARKER (number);
if (FLOATP (number))
return (make_float (1.0 + XFLOAT_DATA (number)));
- XSETINT (number, XINT (number) + 1);
+ if (BIGNUMP (number))
+ {
+ mpz_t num;
+ mpz_init (num);
+ mpz_add_ui (num, XBIGNUM (number)->value, 1);
+ number = make_number (num);
+ mpz_clear (num);
+ }
+ else
+ {
+ eassume (FIXNUMP (number));
+ if (XINT (number) < MOST_POSITIVE_FIXNUM)
+ XSETINT (number, XINT (number) + 1);
+ else
+ {
+ mpz_t num;
+ mpz_init_set_si (num, XINT (number) + 1);
+ number = make_number (num);
+ mpz_clear (num);
+ }
+ }
return number;
}
@@ -3253,12 +3273,32 @@ DEFUN ("1-", Fsub1, Ssub1, 1, 1, 0,
Markers are converted to integers. */)
(register Lisp_Object number)
{
- CHECK_FIXNUM_OR_FLOAT_COERCE_MARKER (number);
+ CHECK_NUMBER_COERCE_MARKER (number);
if (FLOATP (number))
return (make_float (-1.0 + XFLOAT_DATA (number)));
- XSETINT (number, XINT (number) - 1);
+ if (BIGNUMP (number))
+ {
+ mpz_t num;
+ mpz_init (num);
+ mpz_sub_ui (num, XBIGNUM (number)->value, 1);
+ number = make_number (num);
+ mpz_clear (num);
+ }
+ else
+ {
+ eassume (FIXNUMP (number));
+ if (XINT (number) > MOST_POSITIVE_FIXNUM)
+ XSETINT (number, XINT (number) - 1);
+ else
+ {
+ mpz_t num;
+ mpz_init_set_si (num, XINT (number) - 1);
+ number = make_number (num);
+ mpz_clear (num);
+ }
+ }
return number;
}
diff --git a/test/src/data-tests.el b/test/src/data-tests.el
index 1143028..dd6ce19 100644
--- a/test/src/data-tests.el
+++ b/test/src/data-tests.el
@@ -579,4 +579,12 @@ comparing the subr with a much slower lisp implementation."
(v (read s)))
(should (equal (number-to-string v) s))))
+(ert-deftest data-tests-1+ ()
+ (should (> (1+ most-positive-fixnum) most-positive-fixnum))
+ (should (fixnump (1+ (1- most-negative-fixnum)))))
+
+(ert-deftest data-tests-1- ()
+ (should (< (1- most-negative-fixnum) most-negative-fixnum))
+ (should (fixnump (1- (1+ most-positive-fixnum)))))
+
;;; data-tests.el ends here
- [Emacs-diffs] feature/bignum eefa65e 07/24: Make comparison operators handle bignums, (continued)
- [Emacs-diffs] feature/bignum eefa65e 07/24: Make comparison operators handle bignums, Tom Tromey, 2018/07/13
- [Emacs-diffs] feature/bignum b2f3f4e 04/24: Provide new functions to create bignums, Tom Tromey, 2018/07/13
- [Emacs-diffs] feature/bignum 580d173 05/24: Make eql work for bignums, Tom Tromey, 2018/07/13
- [Emacs-diffs] feature/bignum a0f2adb 03/24: Introduce the bignum type, Tom Tromey, 2018/07/13
- [Emacs-diffs] feature/bignum 23eab9a 10/24: Make number-to-string work for bignums, Tom Tromey, 2018/07/13
- [Emacs-diffs] feature/bignum 025adce 13/24: Make abs handle bignums, Tom Tromey, 2018/07/13
- [Emacs-diffs] feature/bignum 6d4bf2c 09/24: Add some bignum tests, Tom Tromey, 2018/07/13
- [Emacs-diffs] feature/bignum 872faab 12/24: Allow conversion of bignums to floats, Tom Tromey, 2018/07/13
- [Emacs-diffs] feature/bignum 5875fba 08/24: Make arithmetic work with bignums, Tom Tromey, 2018/07/13
- [Emacs-diffs] feature/bignum a770fb4 16/24: Make logcount handle bignums, Tom Tromey, 2018/07/13
- [Emacs-diffs] feature/bignum 0d86891 14/24: Make 1+ and 1- handle bignums,
Tom Tromey <=
- [Emacs-diffs] feature/bignum 8fb995b 17/24: Make min and max handle bignums, Tom Tromey, 2018/07/13
- [Emacs-diffs] feature/bignum 3dea8f8 19/24: Make % and mod handle bignums, Tom Tromey, 2018/07/13
- [Emacs-diffs] feature/bignum d14808c 11/24: Make format handle bignums, Tom Tromey, 2018/07/13
- [Emacs-diffs] feature/bignum c7e393b 15/24: Make lognot handle bignums, Tom Tromey, 2018/07/13
- [Emacs-diffs] feature/bignum 1e8ae6c 06/24: Make the reader accept bignums, Tom Tromey, 2018/07/13
- [Emacs-diffs] feature/bignum 27980e3 21/24: Make ash and lsh handle bignums, Tom Tromey, 2018/07/13
- [Emacs-diffs] feature/bignum cca0e79 20/24: Make logb handle bignums, Tom Tromey, 2018/07/13
- [Emacs-diffs] feature/bignum d0fac17 18/24: Let C modules access bignum values, Tom Tromey, 2018/07/13
- [Emacs-diffs] feature/bignum e2a78b0 23/24: Bignum fixes for byte-compiler and bytecode interpreter, Tom Tromey, 2018/07/13
- [Emacs-diffs] feature/bignum 45eb3b3 22/24: Use fixnump rather than integerp in some spots, Tom Tromey, 2018/07/13