diff options
author | Andy Wingo <wingo@pobox.com> | 2013-11-22 15:02:17 +0100 |
---|---|---|
committer | Andy Wingo <wingo@pobox.com> | 2013-11-22 15:02:17 +0100 |
commit | 1cdf9b788ea12eadccd9c4cac1a9e88cb9d46a5f (patch) | |
tree | 8b00d6b8d7d5da9774069649151df66ce18828eb | |
parent | 5f18bc8450511e3616588ce20548cc365b2a81e0 (diff) | |
download | guile-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.c | 18 |
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; } |