aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTom Tromey2018-07-06 23:26:13 -0600
committerTom Tromey2018-07-12 22:12:27 -0600
commit0d868917efb46400cf7dd57a1cdbba7404f322a7 (patch)
tree82a07a0f48b03a6d41fb278ebedc6fc8000a80a6
parent025adce2cf43f4ce9f3c543c1b8973541e1414d2 (diff)
downloademacs-0d868917efb46400cf7dd57a1cdbba7404f322a7.tar.gz
emacs-0d868917efb46400cf7dd57a1cdbba7404f322a7.zip
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.
-rw-r--r--src/data.c48
-rw-r--r--test/src/data-tests.el8
2 files changed, 52 insertions, 4 deletions
diff --git a/src/data.c b/src/data.c
index 18b572de977..d7175683c89 100644
--- a/src/data.c
+++ b/src/data.c
@@ -3239,12 +3239,32 @@ DEFUN ("1+", Fadd1, Sadd1, 1, 1, 0,
3239Markers are converted to integers. */) 3239Markers are converted to integers. */)
3240 (register Lisp_Object number) 3240 (register Lisp_Object number)
3241{ 3241{
3242 CHECK_FIXNUM_OR_FLOAT_COERCE_MARKER (number); 3242 CHECK_NUMBER_COERCE_MARKER (number);
3243 3243
3244 if (FLOATP (number)) 3244 if (FLOATP (number))
3245 return (make_float (1.0 + XFLOAT_DATA (number))); 3245 return (make_float (1.0 + XFLOAT_DATA (number)));
3246 3246
3247 XSETINT (number, XINT (number) + 1); 3247 if (BIGNUMP (number))
3248 {
3249 mpz_t num;
3250 mpz_init (num);
3251 mpz_add_ui (num, XBIGNUM (number)->value, 1);
3252 number = make_number (num);
3253 mpz_clear (num);
3254 }
3255 else
3256 {
3257 eassume (FIXNUMP (number));
3258 if (XINT (number) < MOST_POSITIVE_FIXNUM)
3259 XSETINT (number, XINT (number) + 1);
3260 else
3261 {
3262 mpz_t num;
3263 mpz_init_set_si (num, XINT (number) + 1);
3264 number = make_number (num);
3265 mpz_clear (num);
3266 }
3267 }
3248 return number; 3268 return number;
3249} 3269}
3250 3270
@@ -3253,12 +3273,32 @@ DEFUN ("1-", Fsub1, Ssub1, 1, 1, 0,
3253Markers are converted to integers. */) 3273Markers are converted to integers. */)
3254 (register Lisp_Object number) 3274 (register Lisp_Object number)
3255{ 3275{
3256 CHECK_FIXNUM_OR_FLOAT_COERCE_MARKER (number); 3276 CHECK_NUMBER_COERCE_MARKER (number);
3257 3277
3258 if (FLOATP (number)) 3278 if (FLOATP (number))
3259 return (make_float (-1.0 + XFLOAT_DATA (number))); 3279 return (make_float (-1.0 + XFLOAT_DATA (number)));
3260 3280
3261 XSETINT (number, XINT (number) - 1); 3281 if (BIGNUMP (number))
3282 {
3283 mpz_t num;
3284 mpz_init (num);
3285 mpz_sub_ui (num, XBIGNUM (number)->value, 1);
3286 number = make_number (num);
3287 mpz_clear (num);
3288 }
3289 else
3290 {
3291 eassume (FIXNUMP (number));
3292 if (XINT (number) > MOST_POSITIVE_FIXNUM)
3293 XSETINT (number, XINT (number) - 1);
3294 else
3295 {
3296 mpz_t num;
3297 mpz_init_set_si (num, XINT (number) - 1);
3298 number = make_number (num);
3299 mpz_clear (num);
3300 }
3301 }
3262 return number; 3302 return number;
3263} 3303}
3264 3304
diff --git a/test/src/data-tests.el b/test/src/data-tests.el
index 1143028a126..dd6ce196f96 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."
579 (v (read s))) 579 (v (read s)))
580 (should (equal (number-to-string v) s)))) 580 (should (equal (number-to-string v) s))))
581 581
582(ert-deftest data-tests-1+ ()
583 (should (> (1+ most-positive-fixnum) most-positive-fixnum))
584 (should (fixnump (1+ (1- most-negative-fixnum)))))
585
586(ert-deftest data-tests-1- ()
587 (should (< (1- most-negative-fixnum) most-negative-fixnum))
588 (should (fixnump (1- (1+ most-positive-fixnum)))))
589
582;;; data-tests.el ends here 590;;; data-tests.el ends here