summaryrefslogtreecommitdiff
path: root/libguile/vm.c
diff options
context:
space:
mode:
Diffstat (limited to 'libguile/vm.c')
-rw-r--r--libguile/vm.c18
1 files changed, 13 insertions, 5 deletions
diff --git a/libguile/vm.c b/libguile/vm.c
index aba1580f4..eb0ef9fec 100644
--- a/libguile/vm.c
+++ b/libguile/vm.c
@@ -777,12 +777,20 @@ struct GC_ms_entry *
scm_i_vm_mark_stack (struct scm_vm *vp, struct GC_ms_entry *mark_stack_ptr,
struct GC_ms_entry *mark_stack_limit)
{
- GC_word *word;
+ SCM *sp, *fp;
- for (word = (GC_word *) vp->stack_base; word <= (GC_word *) vp->sp; word++)
- mark_stack_ptr = GC_MARK_AND_PUSH ((* (GC_word **) word),
- mark_stack_ptr, mark_stack_limit,
- NULL);
+ for (fp = vp->fp, sp = vp->sp; fp; fp = SCM_FRAME_DYNAMIC_LINK (fp))
+ {
+ for (; sp >= &SCM_FRAME_LOCAL (fp, 0); sp--)
+ {
+ SCM elt = *sp;
+ if (SCM_NIMP (elt))
+ mark_stack_ptr = GC_MARK_AND_PUSH ((GC_word *) elt,
+ mark_stack_ptr, mark_stack_limit,
+ NULL);
+ }
+ sp = SCM_FRAME_PREVIOUS_SP (fp);
+ }
return mark_stack_ptr;
}