From 8ab0d12e8defc2b1c80db0e2481b2ca2acf71f17 Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Mon, 29 Mar 2010 01:53:20 -0400 Subject: [PATCH] vm: callstack errors were flipped --- core/kernel/kernel-tests.factor | 5 ++++- vm/errors.cpp | 4 ++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/core/kernel/kernel-tests.factor b/core/kernel/kernel-tests.factor index 152e1bac14..7d5f7b538b 100644 --- a/core/kernel/kernel-tests.factor +++ b/core/kernel/kernel-tests.factor @@ -49,8 +49,11 @@ IN: kernel.tests : overflow-c ( -- ) overflow-c overflow-c ; +! The VM cannot recover from callstack overflow on Windows or +! OpenBSD, because no facility exists to run memory protection +! fault handlers on an alternate callstack. os [ windows? ] [ openbsd? ] bi or [ - [ overflow-c ] [ { "kernel-error" 14 f f } = ] must-fail-with + [ overflow-c ] [ { "kernel-error" 15 f f } = ] must-fail-with ] unless [ -7 ] must-fail diff --git a/vm/errors.cpp b/vm/errors.cpp index 21dff5a475..f6ceee9966 100755 --- a/vm/errors.cpp +++ b/vm/errors.cpp @@ -98,9 +98,9 @@ void factor_vm::memory_protection_error(cell addr, stack_frame *stack) else if(ctx->retainstack_seg->overflow_p(addr)) general_error(ERROR_RETAINSTACK_OVERFLOW,false_object,false_object,stack); else if(ctx->callstack_seg->underflow_p(addr)) - general_error(ERROR_CALLSTACK_UNDERFLOW,false_object,false_object,stack); - else if(ctx->callstack_seg->overflow_p(addr)) general_error(ERROR_CALLSTACK_OVERFLOW,false_object,false_object,stack); + else if(ctx->callstack_seg->overflow_p(addr)) + general_error(ERROR_CALLSTACK_UNDERFLOW,false_object,false_object,stack); else general_error(ERROR_MEMORY,allot_cell(addr),false_object,stack); }