summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndy Wingo <wingo@pobox.com>2013-11-22 15:02:17 +0100
committerAndy Wingo <wingo@pobox.com>2013-11-22 15:02:17 +0100
commit1cdf9b788ea12eadccd9c4cac1a9e88cb9d46a5f (patch)
tree8b00d6b8d7d5da9774069649151df66ce18828eb
parent5f18bc8450511e3616588ce20548cc365b2a81e0 (diff)
downloadguile-1cdf9b788ea12eadccd9c4cac1a9e88cb9d46a5f.tar.gz
More precise stack marking.
* libguile/vm.c (scm_i_vm_mark_stack): Mark the stack more precisely.
-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;
}