summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndy Wingo <wingo@pobox.com>2009-01-13 22:33:21 +0100
committerAndy Wingo <wingo@pobox.com>2009-01-13 22:33:21 +0100
commit7aa6f86b77836b4bfe1a59feab7d08517177858e (patch)
tree57da8b790f061272d54e5267dba1da975209e450
parentd5968e7f4e96d957157a31e577d8792afe655371 (diff)
downloadguile-7aa6f86b77836b4bfe1a59feab7d08517177858e.tar.gz
fix marking empty VM continuations
* libguile/vm.h (struct scm_vm_cont): * libguile/vm.c (capture_vm_cont, reinstate_vm_cont): Change so we just store the registers as they are, with the reloc. (vm_cont_mark): Only mark the stack if it has elements on it, otherwise we get a bogus fp. * libguile/stacks.c (scm_make_stack): Update for change to vm continuations.
-rw-r--r--INSTALL5
-rw-r--r--libguile/stacks.c4
-rw-r--r--libguile/vm.c13
-rw-r--r--libguile/vm.h4
4 files changed, 15 insertions, 11 deletions
diff --git a/INSTALL b/INSTALL
index 5458714e1..d3c5b40a9 100644
--- a/INSTALL
+++ b/INSTALL
@@ -2,7 +2,7 @@ Installation Instructions
*************************
Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005,
-2006 Free Software Foundation, Inc.
+2006, 2007 Free Software Foundation, Inc.
This file is free documentation; the Free Software Foundation gives
unlimited permission to copy, distribute and modify it.
@@ -67,6 +67,9 @@ The simplest way to compile this package is:
all sorts of other programs in order to regenerate files that came
with the distribution.
+ 6. Often, you can also type `make uninstall' to remove the installed
+ files again.
+
Compilers and Options
=====================
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;