]> git.eshelyaron.com Git - emacs.git/commitdiff
Make 1+ and 1- handle bignums
authorTom Tromey <tom@tromey.com>
Sat, 7 Jul 2018 05:26:13 +0000 (23:26 -0600)
committerTom Tromey <tom@tromey.com>
Fri, 13 Jul 2018 04:12:27 +0000 (22:12 -0600)
* src/data.c (Fadd1, Fsub1): Handle bignums.
* test/src/data-tests.el (data-tests-1+, data-tests-1-): New tests.

src/data.c
test/src/data-tests.el

index 18b572de977955af02f37825509d82ba11ea51d7..d7175683c8998bf8bfe4d6f66a2f7963dbe4691f 100644 (file)
@@ -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;
 }
 
index 1143028a1260b93105b4420b8b4fe6ef0997c353..dd6ce196f969bf0bab875eed52a173de170e6189 100644 (file)
@@ -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