From a1bbbc0c1328e1adda65ee7e5f074796069a2b1e Mon Sep 17 00:00:00 2001 From: Helmut Eller Date: Thu, 20 Jun 2024 08:47:56 +0200 Subject: [PATCH 4/6] When resurrecting buffers, copy markers to a weak vector * src/igc.h (igc_resurrect_markers): New. * src/igc.c (igc_resurrect_markers): Implementation. (weak_vector_p): New helper. * src/pdumper.c (dump_do_dump_relocation): Use igc_resurrect_markers. --- src/igc.c | 29 +++++++++++++++++++++++++++++ src/igc.h | 1 + src/pdumper.c | 1 + 3 files changed, 31 insertions(+) diff --git a/src/igc.c b/src/igc.c index 9eb55e06000..a464aee07c2 100644 --- a/src/igc.c +++ b/src/igc.c @@ -3522,6 +3522,35 @@ igc_remove_all_markers (struct buffer *b) } } +static bool +weak_vector_p (Lisp_Object x) +{ + if (VECTORP (x)) + { + struct igc *igc = global_igc; + mps_pool_t pool = NULL; + mps_addr_pool (&pool, igc->arena, XVECTOR (x)); + return pool == igc->weak_pool; + } + else + return false; +} + +void +igc_resurrect_markers (struct buffer *b) +{ + Lisp_Object old = BUF_MARKERS (b); + if (NILP (old)) + return; + igc_assert (!weak_vector_p (old)); + size_t len = ASIZE (old); + Lisp_Object new = alloc_vector_weak (len, Qnil); + memcpy (XVECTOR (new)->contents, XVECTOR (old)->contents, + len * sizeof (Lisp_Object)); + BUF_MARKERS (b) = new; + igc_assert (weak_vector_p (BUF_MARKERS (b))); +} + DEFUN ("igc-make-weak-vector", Figc_make_weak_vector, Sigc_make_weak_vector, 2, 2, 0, doc: /* Return a new weak vector of length LENGTH, with each element being INIT. See also the function `vector'. */) diff --git a/src/igc.h b/src/igc.h index 55ef7d4d56c..cd782fca0ca 100644 --- a/src/igc.h +++ b/src/igc.h @@ -79,6 +79,7 @@ #define EMACS_IGC_H void igc_add_marker (struct buffer *b, struct Lisp_Marker *m); void igc_remove_marker (struct buffer *b, struct Lisp_Marker *m); void igc_remove_all_markers (struct buffer *b); +void igc_resurrect_markers (struct buffer *b); Lisp_Object igc_alloc_symbol (void); void *igc_alloc_global_ref (void); diff --git a/src/pdumper.c b/src/pdumper.c index 6f0ca3233bb..e69a2b56f0b 100644 --- a/src/pdumper.c +++ b/src/pdumper.c @@ -5776,6 +5776,7 @@ dump_do_dump_relocation (const uintptr_t dump_base, eassert (pdumper_object_p (b->text->beg)); enlarge_buffer_text (b, 0); eassert (!pdumper_object_p (b->text->beg)); + igc_resurrect_markers (b); } break; #endif -- 2.39.2