diff options
Diffstat (limited to 'libguile')
-rw-r--r-- | libguile/stacks.c | 4 | ||||
-rw-r--r-- | libguile/vm.c | 13 | ||||
-rw-r--r-- | libguile/vm.h | 4 |
3 files changed, 11 insertions, 10 deletions
diff --git a/libguile/stacks.c b/libguile/stacks.c index 85527bd6a..e3d131d12 100644 --- a/libguile/stacks.c +++ b/libguile/stacks.c @@ -516,8 +516,8 @@ SCM_DEFINE (scm_make_stack, "make-stack", 1, 0, 1, vm_cont = scm_cdr (scm_car (cont->vm_conts)); data = SCM_VM_CONT_DATA (vm_cont); vmframe = scm_c_make_vm_frame (vm_cont, - data->stack_base + data->fp, - data->stack_base + data->sp, + data->fp + data->reloc, + data->sp + data->reloc, data->ip, data->reloc); } else diff --git a/libguile/vm.c b/libguile/vm.c index d75fed841..429c0903b 100644 --- a/libguile/vm.c +++ b/libguile/vm.c @@ -119,7 +119,8 @@ vm_cont_mark (SCM obj) { struct scm_vm_cont *p = SCM_VM_CONT_DATA (obj); - vm_mark_stack (p->stack_base, p->stack_size, p->stack_base + p->fp, p->reloc); + if (p->stack_size) + vm_mark_stack (p->stack_base, p->stack_size, p->fp + p->reloc, p->reloc); return SCM_BOOL_F; } @@ -149,8 +150,8 @@ capture_vm_cont (struct scm_vm *vp) memset (p->stack_base, 0, p->stack_size * sizeof (SCM)); #endif p->ip = vp->ip; - p->sp = vp->sp - vp->stack_base; - p->fp = vp->fp - vp->stack_base; + p->sp = vp->sp; + p->fp = vp->fp; memcpy (p->stack_base, vp->stack_base, p->stack_size * sizeof (SCM)); p->reloc = p->stack_base - vp->stack_base; SCM_RETURN_NEWSMOB (scm_tc16_vm_cont, p); @@ -167,7 +168,7 @@ reinstate_vm_cont (struct scm_vm *vp, SCM cont) } #ifdef VM_ENABLE_STACK_NULLING { - scm_t_ptrdiff nzero = (vp->sp - vp->stack_base) - p->sp; + scm_t_ptrdiff nzero = (vp->sp - p->sp); if (nzero > 0) memset (vp->stack_base + p->stack_size, 0, nzero * sizeof (SCM)); /* actually nzero should always be negative, because vm_reset_stack will @@ -175,8 +176,8 @@ reinstate_vm_cont (struct scm_vm *vp, SCM cont) } #endif vp->ip = p->ip; - vp->sp = vp->stack_base + p->sp; - vp->fp = vp->stack_base + p->fp; + vp->sp = p->sp; + vp->fp = p->fp; memcpy (vp->stack_base, p->stack_base, p->stack_size * sizeof (SCM)); } diff --git a/libguile/vm.h b/libguile/vm.h index 90a28911d..d8b6ee2ce 100644 --- a/libguile/vm.h +++ b/libguile/vm.h @@ -102,8 +102,8 @@ extern SCM scm_vm_trace_frame (SCM vm); struct scm_vm_cont { scm_byte_t *ip; - scm_t_ptrdiff sp; - scm_t_ptrdiff fp; + SCM *sp; + SCM *fp; scm_t_ptrdiff stack_size; SCM *stack_base; scm_t_ptrdiff reloc; |