summaryrefslogtreecommitdiff
path: root/libguile/vm.c
diff options
context:
space:
mode:
Diffstat (limited to 'libguile/vm.c')
-rw-r--r--libguile/vm.c49
1 files changed, 7 insertions, 42 deletions
diff --git a/libguile/vm.c b/libguile/vm.c
index bc9f29080..2db079550 100644
--- a/libguile/vm.c
+++ b/libguile/vm.c
@@ -179,21 +179,6 @@ vm_return_to_continuation_inner (void *data_ptr)
cp->stack_size * sizeof (*cp->stack_bottom));
vm_restore_sp (vp, vp->stack_top - cp->stack_size);
- if (reloc)
- {
- union scm_vm_stack_element *fp = vp->fp;
- while (fp)
- {
- union scm_vm_stack_element *next_fp = SCM_FRAME_DYNAMIC_LINK (fp);
- if (next_fp)
- {
- next_fp += reloc;
- SCM_FRAME_SET_DYNAMIC_LINK (fp, next_fp);
- }
- fp = next_fp;
- }
- }
-
return NULL;
}
@@ -385,13 +370,6 @@ vm_reinstate_partial_continuation_inner (void *data_ptr)
vp->fp = cp->fp + reloc;
vp->ip = cp->ra;
- /* now relocate frame pointers */
- {
- union scm_vm_stack_element *fp;
- for (fp = vp->fp; fp < base_fp; fp = SCM_FRAME_DYNAMIC_LINK (fp))
- SCM_FRAME_SET_DYNAMIC_LINK (fp, SCM_FRAME_DYNAMIC_LINK (fp) + reloc);
- }
-
data->reloc = reloc;
return NULL;
@@ -876,7 +854,7 @@ make_vm (void)
vp->ip = NULL;
vp->sp = vp->stack_top;
vp->sp_min_since_gc = vp->sp;
- vp->fp = NULL;
+ vp->fp = vp->stack_top;
vp->engine = vm_default_engine;
vp->trace_level = 0;
for (i = 0; i < SCM_VM_NUM_HOOKS; i++)
@@ -967,7 +945,9 @@ scm_i_vm_mark_stack (struct scm_vm *vp, struct GC_ms_entry *mark_stack_ptr,
memset (&cache, 0, sizeof (cache));
- for (fp = vp->fp, sp = vp->sp; fp; fp = SCM_FRAME_DYNAMIC_LINK (fp))
+ for (fp = vp->fp, sp = vp->sp;
+ fp < vp->stack_top;
+ fp = SCM_FRAME_DYNAMIC_LINK (fp))
{
scm_t_ptrdiff nlocals = SCM_FRAME_NUM_LOCALS (fp, sp);
size_t slot = nlocals - 1;
@@ -1047,24 +1027,9 @@ vm_expand_stack_inner (void *data_ptr)
vp->stack_limit = vp->stack_bottom;
reloc = vp->stack_top - old_top;
- if (reloc)
- {
- union scm_vm_stack_element *fp;
- if (vp->fp)
- vp->fp += reloc;
- data->new_sp += reloc;
- fp = vp->fp;
- while (fp)
- {
- union scm_vm_stack_element *next_fp = SCM_FRAME_DYNAMIC_LINK (fp);
- if (next_fp)
- {
- next_fp += reloc;
- SCM_FRAME_SET_DYNAMIC_LINK (fp, next_fp);
- }
- fp = next_fp;
- }
- }
+ if (vp->fp)
+ vp->fp += reloc;
+ data->new_sp += reloc;
return new_bottom;
}