diff options
| author | Paul Eggert | 2019-08-21 00:06:00 -0700 |
|---|---|---|
| committer | Paul Eggert | 2019-08-21 00:11:45 -0700 |
| commit | 39fee209942ab7c35b4789f0010264cd6a52197b (patch) | |
| tree | 96f1858c890436713ba0da0fca93d1f33d7dd33a /src/data.c | |
| parent | 3881542edeac3e94291c2ce574edf0b0e52764a8 (diff) | |
| download | emacs-39fee209942ab7c35b4789f0010264cd6a52197b.tar.gz emacs-39fee209942ab7c35b4789f0010264cd6a52197b.zip | |
Be more careful about pointers to bignum vals
This uses ‘const’ to be better at catching bugs that
mistakenly attempt to modify a bignum value.
Lisp bignums are supposed to be immutable.
* src/alloc.c (make_pure_bignum):
* src/fns.c (sxhash_bignum):
Accept Lisp_Object instead of struct Lisp_Bignum *, as that’s
simpler now. Caller changed.
* src/bignum.h (bignum_val, xbignum_val): New inline functions.
Prefer them to &i->value and XBIGNUM (i)->value, since they
apply ‘const’ to the result.
* src/timefns.c (lisp_to_timespec): Use mpz_t const *
to point to a bignum value.
Diffstat (limited to 'src/data.c')
| -rw-r--r-- | src/data.c | 30 |
1 files changed, 15 insertions, 15 deletions
diff --git a/src/data.c b/src/data.c index cf9f8e56133..8344bfdd3d5 100644 --- a/src/data.c +++ b/src/data.c | |||
| @@ -525,7 +525,7 @@ DEFUN ("natnump", Fnatnump, Snatnump, 1, 1, 0, | |||
| 525 | (Lisp_Object object) | 525 | (Lisp_Object object) |
| 526 | { | 526 | { |
| 527 | return ((FIXNUMP (object) ? 0 <= XFIXNUM (object) | 527 | return ((FIXNUMP (object) ? 0 <= XFIXNUM (object) |
| 528 | : BIGNUMP (object) && 0 <= mpz_sgn (XBIGNUM (object)->value)) | 528 | : BIGNUMP (object) && 0 <= mpz_sgn (*xbignum_val (object))) |
| 529 | ? Qt : Qnil); | 529 | ? Qt : Qnil); |
| 530 | } | 530 | } |
| 531 | 531 | ||
| @@ -2481,7 +2481,7 @@ arithcompare (Lisp_Object num1, Lisp_Object num2, | |||
| 2481 | else if (isnan (f1)) | 2481 | else if (isnan (f1)) |
| 2482 | lt = eq = gt = false; | 2482 | lt = eq = gt = false; |
| 2483 | else | 2483 | else |
| 2484 | i2 = mpz_cmp_d (XBIGNUM (num2)->value, f1); | 2484 | i2 = mpz_cmp_d (*xbignum_val (num2), f1); |
| 2485 | } | 2485 | } |
| 2486 | else if (FIXNUMP (num1)) | 2486 | else if (FIXNUMP (num1)) |
| 2487 | { | 2487 | { |
| @@ -2502,7 +2502,7 @@ arithcompare (Lisp_Object num1, Lisp_Object num2, | |||
| 2502 | i2 = XFIXNUM (num2); | 2502 | i2 = XFIXNUM (num2); |
| 2503 | } | 2503 | } |
| 2504 | else | 2504 | else |
| 2505 | i2 = mpz_sgn (XBIGNUM (num2)->value); | 2505 | i2 = mpz_sgn (*xbignum_val (num2)); |
| 2506 | } | 2506 | } |
| 2507 | else if (FLOATP (num2)) | 2507 | else if (FLOATP (num2)) |
| 2508 | { | 2508 | { |
| @@ -2510,12 +2510,12 @@ arithcompare (Lisp_Object num1, Lisp_Object num2, | |||
| 2510 | if (isnan (f2)) | 2510 | if (isnan (f2)) |
| 2511 | lt = eq = gt = false; | 2511 | lt = eq = gt = false; |
| 2512 | else | 2512 | else |
| 2513 | i1 = mpz_cmp_d (XBIGNUM (num1)->value, f2); | 2513 | i1 = mpz_cmp_d (*xbignum_val (num1), f2); |
| 2514 | } | 2514 | } |
| 2515 | else if (FIXNUMP (num2)) | 2515 | else if (FIXNUMP (num2)) |
| 2516 | i1 = mpz_sgn (XBIGNUM (num1)->value); | 2516 | i1 = mpz_sgn (*xbignum_val (num1)); |
| 2517 | else | 2517 | else |
| 2518 | i1 = mpz_cmp (XBIGNUM (num1)->value, XBIGNUM (num2)->value); | 2518 | i1 = mpz_cmp (*xbignum_val (num1), *xbignum_val (num2)); |
| 2519 | 2519 | ||
| 2520 | if (eq) | 2520 | if (eq) |
| 2521 | { | 2521 | { |
| @@ -3005,7 +3005,7 @@ usage: (- &optional NUMBER-OR-MARKER &rest MORE-NUMBERS-OR-MARKERS) */) | |||
| 3005 | return make_int (-XFIXNUM (a)); | 3005 | return make_int (-XFIXNUM (a)); |
| 3006 | if (FLOATP (a)) | 3006 | if (FLOATP (a)) |
| 3007 | return make_float (-XFLOAT_DATA (a)); | 3007 | return make_float (-XFLOAT_DATA (a)); |
| 3008 | mpz_neg (mpz[0], XBIGNUM (a)->value); | 3008 | mpz_neg (mpz[0], *xbignum_val (a)); |
| 3009 | return make_integer_mpz (); | 3009 | return make_integer_mpz (); |
| 3010 | } | 3010 | } |
| 3011 | return arith_driver (Asub, nargs, args, a); | 3011 | return arith_driver (Asub, nargs, args, a); |
| @@ -3214,7 +3214,7 @@ representation. */) | |||
| 3214 | 3214 | ||
| 3215 | if (BIGNUMP (value)) | 3215 | if (BIGNUMP (value)) |
| 3216 | { | 3216 | { |
| 3217 | mpz_t *nonneg = &XBIGNUM (value)->value; | 3217 | mpz_t const *nonneg = xbignum_val (value); |
| 3218 | if (mpz_sgn (*nonneg) < 0) | 3218 | if (mpz_sgn (*nonneg) < 0) |
| 3219 | { | 3219 | { |
| 3220 | mpz_com (mpz[0], *nonneg); | 3220 | mpz_com (mpz[0], *nonneg); |
| @@ -3245,10 +3245,10 @@ In this case, the sign bit is duplicated. */) | |||
| 3245 | { | 3245 | { |
| 3246 | if (EQ (value, make_fixnum (0))) | 3246 | if (EQ (value, make_fixnum (0))) |
| 3247 | return value; | 3247 | return value; |
| 3248 | if (mpz_sgn (XBIGNUM (count)->value) < 0) | 3248 | if (mpz_sgn (*xbignum_val (count)) < 0) |
| 3249 | { | 3249 | { |
| 3250 | EMACS_INT v = (FIXNUMP (value) ? XFIXNUM (value) | 3250 | EMACS_INT v = (FIXNUMP (value) ? XFIXNUM (value) |
| 3251 | : mpz_sgn (XBIGNUM (value)->value)); | 3251 | : mpz_sgn (*xbignum_val (value))); |
| 3252 | return make_fixnum (v < 0 ? -1 : 0); | 3252 | return make_fixnum (v < 0 ? -1 : 0); |
| 3253 | } | 3253 | } |
| 3254 | overflow_error (); | 3254 | overflow_error (); |
| @@ -3291,8 +3291,8 @@ expt_integer (Lisp_Object x, Lisp_Object y) | |||
| 3291 | if (TYPE_RANGED_FIXNUMP (unsigned long, y)) | 3291 | if (TYPE_RANGED_FIXNUMP (unsigned long, y)) |
| 3292 | exp = XFIXNUM (y); | 3292 | exp = XFIXNUM (y); |
| 3293 | else if (MOST_POSITIVE_FIXNUM < ULONG_MAX && BIGNUMP (y) | 3293 | else if (MOST_POSITIVE_FIXNUM < ULONG_MAX && BIGNUMP (y) |
| 3294 | && mpz_fits_ulong_p (XBIGNUM (y)->value)) | 3294 | && mpz_fits_ulong_p (*xbignum_val (y))) |
| 3295 | exp = mpz_get_ui (XBIGNUM (y)->value); | 3295 | exp = mpz_get_ui (*xbignum_val (y)); |
| 3296 | else | 3296 | else |
| 3297 | overflow_error (); | 3297 | overflow_error (); |
| 3298 | 3298 | ||
| @@ -3311,7 +3311,7 @@ Markers are converted to integers. */) | |||
| 3311 | return make_int (XFIXNUM (number) + 1); | 3311 | return make_int (XFIXNUM (number) + 1); |
| 3312 | if (FLOATP (number)) | 3312 | if (FLOATP (number)) |
| 3313 | return (make_float (1.0 + XFLOAT_DATA (number))); | 3313 | return (make_float (1.0 + XFLOAT_DATA (number))); |
| 3314 | mpz_add_ui (mpz[0], XBIGNUM (number)->value, 1); | 3314 | mpz_add_ui (mpz[0], *xbignum_val (number), 1); |
| 3315 | return make_integer_mpz (); | 3315 | return make_integer_mpz (); |
| 3316 | } | 3316 | } |
| 3317 | 3317 | ||
| @@ -3326,7 +3326,7 @@ Markers are converted to integers. */) | |||
| 3326 | return make_int (XFIXNUM (number) - 1); | 3326 | return make_int (XFIXNUM (number) - 1); |
| 3327 | if (FLOATP (number)) | 3327 | if (FLOATP (number)) |
| 3328 | return (make_float (-1.0 + XFLOAT_DATA (number))); | 3328 | return (make_float (-1.0 + XFLOAT_DATA (number))); |
| 3329 | mpz_sub_ui (mpz[0], XBIGNUM (number)->value, 1); | 3329 | mpz_sub_ui (mpz[0], *xbignum_val (number), 1); |
| 3330 | return make_integer_mpz (); | 3330 | return make_integer_mpz (); |
| 3331 | } | 3331 | } |
| 3332 | 3332 | ||
| @@ -3337,7 +3337,7 @@ DEFUN ("lognot", Flognot, Slognot, 1, 1, 0, | |||
| 3337 | CHECK_INTEGER (number); | 3337 | CHECK_INTEGER (number); |
| 3338 | if (FIXNUMP (number)) | 3338 | if (FIXNUMP (number)) |
| 3339 | return make_fixnum (~XFIXNUM (number)); | 3339 | return make_fixnum (~XFIXNUM (number)); |
| 3340 | mpz_com (mpz[0], XBIGNUM (number)->value); | 3340 | mpz_com (mpz[0], *xbignum_val (number)); |
| 3341 | return make_integer_mpz (); | 3341 | return make_integer_mpz (); |
| 3342 | } | 3342 | } |
| 3343 | 3343 | ||