From 3a0d2b439dd91b569f7e03c52987bedd3034c38b Mon Sep 17 00:00:00 2001 From: Pip Cet Date: Thu, 4 Jul 2024 19:14:57 +0000 Subject: [PATCH 5/5] finalize bignums later. This avoids the need for splatting PVECs. --- src/igc.c | 21 ++++++++++++++++++++- src/lisp.h | 1 + src/pdumper.c | 2 +- 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/src/igc.c b/src/igc.c index 7a42470f061..1640a490c6b 100644 --- a/src/igc.c +++ b/src/igc.c @@ -383,6 +383,7 @@ obj_type_name (enum igc_obj_type type) "PVEC_NORMAL_VECTOR", "PVEC_FREE", "PVEC_BIGNUM", + "PVEC_BIGNUM_FINALIZER", "PVEC_MARKER", "PVEC_OVERLAY", "PVEC_FINALIZER", @@ -2448,6 +2449,9 @@ fix_vector (mps_ss_t ss, struct Lisp_Vector *v) case PVEC_BIGNUM: break; + case PVEC_BIGNUM_FINALIZER: + break; + case PVEC_NATIVE_COMP_UNIT: IGC_FIX_CALL_FN (ss, struct Lisp_Native_Comp_Unit, v, fix_comp_unit); break; @@ -3101,6 +3105,15 @@ finalize_finalizer (struct Lisp_Finalizer *f) #define SPLAT_PVEC(v) \ (((v)->header.size &= ~PVEC_TYPE_MASK), XSETPVECTYPE(v, PVEC_FREE)) +static Lisp_Object +make_bignum_finalizer (struct Lisp_Bignum *n) +{ + struct Lisp_Bignum *b = ALLOCATE_PLAIN_PSEUDOVECTOR (struct Lisp_Bignum, + PVEC_BIGNUM_FINALIZER); + memcpy (&b->value, &n->value, sizeof (b->value)); + return make_lisp_ptr (b, Lisp_Vectorlike); +} + static void finalize_vector (mps_addr_t v) { @@ -3111,6 +3124,12 @@ finalize_vector (mps_addr_t v) emacs_abort (); case PVEC_BIGNUM: + Figc_add_extra_dependency (make_lisp_ptr (vec, Lisp_Vectorlike), + make_bignum_finalizer (v), + Qt); + break; + + case PVEC_BIGNUM_FINALIZER: finalize_bignum (v); break; @@ -3201,7 +3220,6 @@ finalize_vector (mps_addr_t v) igc_assert (!"finalization not implemented"); break; } - SPLAT_PVEC (vec); } static void @@ -3262,6 +3280,7 @@ maybe_finalize (mps_addr_t client, enum pvec_type tag) switch (tag) { case PVEC_BIGNUM: + case PVEC_BIGNUM_FINALIZER: case PVEC_FONT: case PVEC_THREAD: case PVEC_MUTEX: diff --git a/src/lisp.h b/src/lisp.h index 34bf483b511..a7e11a43899 100644 --- a/src/lisp.h +++ b/src/lisp.h @@ -1027,6 +1027,7 @@ DEFINE_GDB_SYMBOL_END (PSEUDOVECTOR_FLAG) PVEC_NORMAL_VECTOR, /* Should be first, for sxhash_obj. */ PVEC_FREE, PVEC_BIGNUM, + PVEC_BIGNUM_FINALIZER, PVEC_MARKER, PVEC_OVERLAY, PVEC_FINALIZER, diff --git a/src/pdumper.c b/src/pdumper.c index 73719567f80..76c7cf7383d 100644 --- a/src/pdumper.c +++ b/src/pdumper.c @@ -3131,7 +3131,7 @@ dump_vectorlike (struct dump_context *ctx, Lisp_Object lv, dump_off offset) { -#if CHECK_STRUCTS && !defined HASH_pvec_type_914166A3B4 +#if CHECK_STRUCTS && !defined HASH_pvec_type_5F7ABD3A67 # error "pvec_type changed. See CHECK_STRUCTS comment in config.h." #endif const struct Lisp_Vector *v = XVECTOR (lv); -- 2.45.2