wingo pushed a commit to branch wip-whippet
in repository guile.

commit 2e0c7c9696e23df2bad6ac9ad36e3dbe6e0f8279
Author: Andy Wingo <wi...@pobox.com>
AuthorDate: Tue Jul 1 15:32:21 2025 +0200

    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);

Reply via email to