diff options
| author | Tom Tromey | 2018-07-06 23:26:13 -0600 |
|---|---|---|
| committer | Tom Tromey | 2018-07-12 22:12:27 -0600 |
| commit | 0d868917efb46400cf7dd57a1cdbba7404f322a7 (patch) | |
| tree | 82a07a0f48b03a6d41fb278ebedc6fc8000a80a6 | |
| parent | 025adce2cf43f4ce9f3c543c1b8973541e1414d2 (diff) | |
| download | emacs-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.c | 48 | ||||
| -rw-r--r-- | test/src/data-tests.el | 8 |
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, | |||
| 3239 | Markers are converted to integers. */) | 3239 | Markers 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, | |||
| 3253 | Markers are converted to integers. */) | 3273 | Markers 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 |