diff options
| author | Tom Tromey | 2018-08-08 17:01:14 -0600 |
|---|---|---|
| committer | Tom Tromey | 2018-08-08 17:01:14 -0600 |
| commit | fb26c9fd69d93aaa789e71365c030083c7f3c775 (patch) | |
| tree | 90f3e28a4ff77119f33d5eafd6f38fbbfe9d7d95 /src/alloc.c | |
| parent | d1ec3a0a8e4d7d56ebc1e4fa743130b9974ac6a8 (diff) | |
| download | emacs-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.c | 30 |
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 | |||
| 5541 | static Lisp_Object | ||
| 5542 | make_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"); |