diff options
| author | Paul Eggert <eggert@cs.ucla.edu> | 2019-08-21 00:06:00 -0700 |
|---|---|---|
| committer | Paul Eggert <eggert@cs.ucla.edu> | 2019-08-21 00:11:45 -0700 |
| commit | 39fee209942ab7c35b4789f0010264cd6a52197b (patch) | |
| tree | 96f1858c890436713ba0da0fca93d1f33d7dd33a /src/alloc.c | |
| parent | 3881542edeac3e94291c2ce574edf0b0e52764a8 (diff) | |
| download | emacs-39fee209942ab7c35b4789f0010264cd6a52197b.tar.gz | |
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/alloc.c')
| -rw-r--r-- | src/alloc.c | 11 |
1 files changed, 6 insertions, 5 deletions
diff --git a/src/alloc.c b/src/alloc.c index bb8e97f8737..53af7325f47 100644 --- a/src/alloc.c +++ b/src/alloc.c @@ -5290,9 +5290,10 @@ make_pure_float (double num) space. */ static Lisp_Object -make_pure_bignum (struct Lisp_Bignum *value) +make_pure_bignum (Lisp_Object value) { - size_t i, nlimbs = mpz_size (value->value); + mpz_t const *n = xbignum_val (value); + size_t i, nlimbs = mpz_size (*n); size_t nbytes = nlimbs * sizeof (mp_limb_t); mp_limb_t *pure_limbs; mp_size_t new_size; @@ -5303,10 +5304,10 @@ make_pure_bignum (struct Lisp_Bignum *value) int limb_alignment = alignof (mp_limb_t); pure_limbs = pure_alloc (nbytes, - limb_alignment); for (i = 0; i < nlimbs; ++i) - pure_limbs[i] = mpz_getlimbn (value->value, i); + pure_limbs[i] = mpz_getlimbn (*n, i); new_size = nlimbs; - if (mpz_sgn (value->value) < 0) + if (mpz_sgn (*n) < 0) new_size = -new_size; mpz_roinit_n (b->value, pure_limbs, new_size); @@ -5456,7 +5457,7 @@ purecopy (Lisp_Object obj) return obj; } else if (BIGNUMP (obj)) - obj = make_pure_bignum (XBIGNUM (obj)); + obj = make_pure_bignum (obj); else { AUTO_STRING (fmt, "Don't know how to purify: %S"); |
