From 8e53493c06cd798476a79238523d566582a0430a Mon Sep 17 00:00:00 2001 From: Pip Cet Date: Tue, 23 Jul 2024 18:57:34 +0000 Subject: [PATCH] dump bignums properly --- lisp/loadup.el | 2 ++ src/alloc.c | 2 +- src/bignum.c | 3 +++ src/igc.c | 6 ++---- src/pdumper.c | 6 ++++-- 5 files changed, 12 insertions(+), 7 deletions(-) diff --git a/lisp/loadup.el b/lisp/loadup.el index 6d1e13f44bf..df178b3bb2f 100644 --- a/lisp/loadup.el +++ b/lisp/loadup.el @@ -184,6 +184,8 @@ (file-error (load "ldefs-boot.el"))) +(setq foo (lsh 1 92)) + (let ((new (make-hash-table :test #'equal))) ;; Now that loaddefs has populated definition-prefixes, purify its contents. (maphash (lambda (k v) (puthash (purecopy k) (purecopy v) new)) diff --git a/src/alloc.c b/src/alloc.c index 320a5adaf0b..3c10a1b605f 100644 --- a/src/alloc.c +++ b/src/alloc.c @@ -6118,7 +6118,7 @@ make_pure_float (double num) /* Value is a bignum object with value VALUE allocated from pure space. */ -static Lisp_Object +Lisp_Object make_pure_bignum (Lisp_Object value) { mpz_t const *n = xbignum_val (value); diff --git a/src/bignum.c b/src/bignum.c index 1fe195d78ea..57e92599cc6 100644 --- a/src/bignum.c +++ b/src/bignum.c @@ -48,6 +48,9 @@ xfree_for_gmp (void *ptr, size_t ignore) xfree (ptr); } +extern Lisp_Object +make_pure_bignum (Lisp_Object value); + void init_bignum (void) { diff --git a/src/igc.c b/src/igc.c index ad5f7cc3e7a..d1cdce82f98 100644 --- a/src/igc.c +++ b/src/igc.c @@ -4766,8 +4766,7 @@ igc_dump_finish_obj (void *client, enum igc_obj_type type, igc_assert (base + obj_size (h) >= end); if (type != IGC_OBJ_DUMPED_BYTES && type != IGC_OBJ_DUMPED_CODE_SPACE_MASKS && - type != IGC_OBJ_DUMPED_BUFFER_TEXT && - type != IGC_OBJ_DUMPED_BIGNUM_DATA) + type != IGC_OBJ_DUMPED_BUFFER_TEXT) *out = *h; igc_assert (header_nwords (out) > 0); return base + obj_size (h); @@ -4780,8 +4779,7 @@ igc_dump_finish_obj (void *client, enum igc_obj_type type, type = (is_pure (client) ? pure_obj_type_and_hash (&hash, type, client) : builtin_obj_type_and_hash (&hash, type, client)); - if (type != IGC_OBJ_DUMPED_BIGNUM_DATA) - set_header (out, type, nbytes, hash); + set_header (out, type, nbytes, hash); return base + nbytes; } diff --git a/src/pdumper.c b/src/pdumper.c index 996bdc79106..0f82be46e75 100644 --- a/src/pdumper.c +++ b/src/pdumper.c @@ -913,7 +913,8 @@ dump_igc_start_obj (struct dump_context *ctx, enum igc_obj_type type, ctx->igc_base_offset = ctx->offset; if (ctx->flags.dump_object_contents && (type == IGC_OBJ_DUMPED_BYTES || - type == IGC_OBJ_DUMPED_CODE_SPACE_MASKS)) + type == IGC_OBJ_DUMPED_CODE_SPACE_MASKS || + type == IGC_OBJ_DUMPED_BIGNUM_DATA)) { /* This saving of obj_offset is Because of an assertion in dump_write. */ @@ -3638,8 +3639,9 @@ dump_cold_bignum (struct dump_context *ctx, Lisp_Object object) eassert (sz_nlimbs < DUMP_OFF_MAX); dump_align_output (ctx, alignof (mp_limb_t)); dump_off nlimbs = (dump_off) sz_nlimbs; + char *dummy = (void *)igc_alloc_bytes (nlimbs * sizeof (mp_limb_t)); # ifdef HAVE_MPS - dump_igc_start_obj (ctx, IGC_OBJ_DUMPED_BIGNUM_DATA, n); + dump_igc_start_obj (ctx, IGC_OBJ_DUMPED_BIGNUM_DATA, dummy - sizeof (uint64_t)); # endif Lisp_Object descriptor = list2 (dump_off_to_lisp (ctx->offset), -- 2.45.2