diff options
author | Ludovic Courtès <ludo@gnu.org> | 2010-05-26 23:00:58 +0200 |
---|---|---|
committer | Ludovic Courtès <ludo@gnu.org> | 2010-05-26 23:41:23 +0200 |
commit | f1046e6b78f3044db6d9fd64cf272864366a1182 (patch) | |
tree | 8b12f0cdcc257a75372ed88e8b63708048ea1d4d /libguile/vm.c | |
parent | 01fded8c776feba9cb721996414dd98cd687e917 (diff) | |
download | guile-f1046e6b78f3044db6d9fd64cf272864366a1182.tar.gz |
Raise an exception upon VM stack overflows (fixes bug #29574).
* libguile/vm-engine.c (VM_NAME)[vm_error_stack_overflow]: Increase
`vp->stack_limit' when possible.
* libguile/vm.c (VM_STACK_RESERVE_SIZE): New macro.
* test-suite/lib.scm (exception:vm-error): New variable.
* test-suite/tests/eval.test ("stack overflow"): New test prefix.
Diffstat (limited to 'libguile/vm.c')
-rw-r--r-- | libguile/vm.c | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/libguile/vm.c b/libguile/vm.c index 1f3e1f85b..e036b63e1 100644 --- a/libguile/vm.c +++ b/libguile/vm.c @@ -65,6 +65,10 @@ for a discussion. */ #define VM_ENABLE_PRECISE_STACK_GC_SCAN +/* Size in SCM objects of the stack reserve. The reserve is used to run + exception handling code in case of a VM stack overflow. */ +#define VM_STACK_RESERVE_SIZE 512 + /* @@ -505,7 +509,7 @@ make_vm (void) #ifdef VM_ENABLE_STACK_NULLING memset (vp->stack_base, 0, vp->stack_size * sizeof (SCM)); #endif - vp->stack_limit = vp->stack_base + vp->stack_size; + vp->stack_limit = vp->stack_base + vp->stack_size - VM_STACK_RESERVE_SIZE; vp->ip = NULL; vp->sp = vp->stack_base - 1; vp->fp = NULL; @@ -534,8 +538,7 @@ vm_stack_mark (GC_word *addr, struct GC_ms_entry *mark_stack_ptr, vm = * ((struct scm_vm **) addr); if (vm == NULL - || (SCM *) addr != vm->stack_base - 1 - || vm->stack_limit - vm->stack_base != vm->stack_size) + || (SCM *) addr != vm->stack_base - 1) /* ADDR must be a pointer to a free-list element, which we must ignore (see warning in <gc/gc_mark.h>). */ return mark_stack_ptr; |