aboutsummaryrefslogtreecommitdiffstats
path: root/src/data.c
diff options
context:
space:
mode:
authorPaul Eggert2019-08-21 00:06:00 -0700
committerPaul Eggert2019-08-21 00:11:45 -0700
commit39fee209942ab7c35b4789f0010264cd6a52197b (patch)
tree96f1858c890436713ba0da0fca93d1f33d7dd33a /src/data.c
parent3881542edeac3e94291c2ce574edf0b0e52764a8 (diff)
downloademacs-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.c30
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