From 2e0c7c9696e23df2bad6ac9ad36e3dbe6e0f8279 Mon Sep 17 00:00:00 2001 From: Andy Wingo Date: Tue, 1 Jul 2025 15:32:21 +0200 Subject: [PATCH] Dynstack snapshot relocation * libguile/dynstack.c (scm_trace_dynstack): Allow for snapshots to be relocated. --- libguile/dynstack.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/libguile/dynstack.c b/libguile/dynstack.c index 898112760..7f9238f51 100644 --- a/libguile/dynstack.c +++ b/libguile/dynstack.c @@ -140,9 +140,17 @@ scm_trace_dynstack (struct scm_dynstack *dynstack, void *trace_data), struct gc_heap *heap, void *trace_data) { - scm_t_bits *walk; + if (dynstack->tag != -1) { + /* If the tag is set, this is a snapshot. If the snapshot is + evacuated, we need to relocate our interior pointers. */ + ptrdiff_t reloc = dynstack->inline_storage - dynstack->base; + dynstack->base += reloc; + dynstack->limit += reloc; + dynstack->top += reloc; + } - for (walk = scm_dynstack_prev (dynstack->top); walk; + for (scm_t_bits *walk = scm_dynstack_prev (dynstack->top); + walk; walk = scm_dynstack_prev (walk)) { scm_t_bits tag = scm_dynstack_tag (walk);