aboutsummaryrefslogtreecommitdiffstats
path: root/src/alloc.c
diff options
context:
space:
mode:
authorTom Tromey2018-08-08 17:01:14 -0600
committerTom Tromey2018-08-08 17:01:14 -0600
commitfb26c9fd69d93aaa789e71365c030083c7f3c775 (patch)
tree90f3e28a4ff77119f33d5eafd6f38fbbfe9d7d95 /src/alloc.c
parentd1ec3a0a8e4d7d56ebc1e4fa743130b9974ac6a8 (diff)
downloademacs-fb26c9fd69d93aaa789e71365c030083c7f3c775.tar.gz
emacs-fb26c9fd69d93aaa789e71365c030083c7f3c775.zip
Make purecopy work for bignums
* src/alloc.c (make_pure_bignum): New function. (purecopy): Use it.
Diffstat (limited to 'src/alloc.c')
-rw-r--r--src/alloc.c30
1 files changed, 30 insertions, 0 deletions
diff --git a/src/alloc.c b/src/alloc.c
index 512fdadfb2e..edfb87e5cdd 100644
--- a/src/alloc.c
+++ b/src/alloc.c
@@ -5535,6 +5535,34 @@ make_pure_float (double num)
5535 return new; 5535 return new;
5536} 5536}
5537 5537
5538/* Value is a bignum object with value VALUE allocated from pure
5539 space. */
5540
5541static Lisp_Object
5542make_pure_bignum (struct Lisp_Bignum *value)
5543{
5544 Lisp_Object new;
5545 size_t i, nlimbs = mpz_size (value->value);
5546 size_t nbytes = nlimbs * sizeof (mp_limb_t);
5547 mp_limb_t *pure_limbs;
5548 mp_size_t new_size;
5549
5550 struct Lisp_Bignum *b = pure_alloc (sizeof (struct Lisp_Bignum), Lisp_Misc);
5551 b->type = Lisp_Misc_Bignum;
5552
5553 pure_limbs = pure_alloc (nbytes, -1);
5554 for (i = 0; i < nlimbs; ++i)
5555 pure_limbs[i] = mpz_getlimbn (value->value, i);
5556
5557 new_size = nlimbs;
5558 if (mpz_sgn (value->value) < 0)
5559 new_size = -new_size;
5560
5561 mpz_roinit_n (b->value, pure_limbs, new_size);
5562
5563 XSETMISC (new, b);
5564 return new;
5565}
5538 5566
5539/* Return a vector with room for LEN Lisp_Objects allocated from 5567/* Return a vector with room for LEN Lisp_Objects allocated from
5540 pure space. */ 5568 pure space. */
@@ -5676,6 +5704,8 @@ purecopy (Lisp_Object obj)
5676 /* Don't hash-cons it. */ 5704 /* Don't hash-cons it. */
5677 return obj; 5705 return obj;
5678 } 5706 }
5707 else if (BIGNUMP (obj))
5708 obj = make_pure_bignum (XBIGNUM (obj));
5679 else 5709 else
5680 { 5710 {
5681 AUTO_STRING (fmt, "Don't know how to purify: %S"); 5711 AUTO_STRING (fmt, "Don't know how to purify: %S");