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