aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorTom Tromey2018-07-06 23:26:13 -0600
committerTom Tromey2018-07-12 22:12:27 -0600
commit0d868917efb46400cf7dd57a1cdbba7404f322a7 (patch)
tree82a07a0f48b03a6d41fb278ebedc6fc8000a80a6 /src
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.
Diffstat (limited to 'src')
-rw-r--r--src/data.c48
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,
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