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 /src | |
| 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.
Diffstat (limited to 'src')
| -rw-r--r-- | src/data.c | 48 |
1 files changed, 44 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 | ||