From 432d4f79e9eeba9bffcb43d53ab01f68bd64f040 Mon Sep 17 00:00:00 2001 From: Joe Groff Date: Wed, 21 Oct 2009 23:37:51 -0500 Subject: [PATCH] give better error message for windows exceptions, and don't lop off the top end of the exception code when the vm throws the error --- basis/debugger/windows/windows.factor | 38 ++++++++++++++++++++++++-- basis/windows/kernel32/kernel32.factor | 26 ++++++++++++++++++ vm/errors.cpp | 2 +- 3 files changed, 63 insertions(+), 3 deletions(-) diff --git a/basis/debugger/windows/windows.factor b/basis/debugger/windows/windows.factor index 1f4b8fb0ac..3485d96447 100644 --- a/basis/debugger/windows/windows.factor +++ b/basis/debugger/windows/windows.factor @@ -1,6 +1,40 @@ ! Copyright (C) 2009 Slava Pestov. ! See http://factorcode.org/license.txt for BSD license. -USING: debugger io prettyprint sequences system ; +USING: assocs debugger io kernel literals namespaces prettyprint +sequences system windows.kernel32 ; IN: debugger.windows -M: windows signal-error. "Windows exception #" write third .h ; \ No newline at end of file +CONSTANT: seh-names + H{ + { $ STATUS_GUARD_PAGE_VIOLATION "STATUS_GUARD_PAGE_VIOLATION" } + { $ STATUS_DATATYPE_MISALIGNMENT "STATUS_DATATYPE_MISALIGNMENT" } + { $ STATUS_BREAKPOINT "STATUS_BREAKPOINT" } + { $ STATUS_SINGLE_STEP "STATUS_SINGLE_STEP" } + { $ STATUS_ACCESS_VIOLATION "STATUS_ACCESS_VIOLATION" } + { $ STATUS_IN_PAGE_ERROR "STATUS_IN_PAGE_ERROR" } + { $ STATUS_INVALID_HANDLE "STATUS_INVALID_HANDLE" } + { $ STATUS_NO_MEMORY "STATUS_NO_MEMORY" } + { $ STATUS_ILLEGAL_INSTRUCTION "STATUS_ILLEGAL_INSTRUCTION" } + { $ STATUS_NONCONTINUABLE_EXCEPTION "STATUS_NONCONTINUABLE_EXCEPTION" } + { $ STATUS_INVALID_DISPOSITION "STATUS_INVALID_DISPOSITION" } + { $ STATUS_ARRAY_BOUNDS_EXCEEDED "STATUS_ARRAY_BOUNDS_EXCEEDED" } + { $ STATUS_FLOAT_DENORMAL_OPERAND "STATUS_FLOAT_DENORMAL_OPERAND" } + { $ STATUS_FLOAT_DIVIDE_BY_ZERO "STATUS_FLOAT_DIVIDE_BY_ZERO" } + { $ STATUS_FLOAT_INEXACT_RESULT "STATUS_FLOAT_INEXACT_RESULT" } + { $ STATUS_FLOAT_INVALID_OPERATION "STATUS_FLOAT_INVALID_OPERATION" } + { $ STATUS_FLOAT_OVERFLOW "STATUS_FLOAT_OVERFLOW" } + { $ STATUS_FLOAT_STACK_CHECK "STATUS_FLOAT_STACK_CHECK" } + { $ STATUS_FLOAT_UNDERFLOW "STATUS_FLOAT_UNDERFLOW" } + { $ STATUS_INTEGER_DIVIDE_BY_ZERO "STATUS_INTEGER_DIVIDE_BY_ZERO" } + { $ STATUS_INTEGER_OVERFLOW "STATUS_INTEGER_OVERFLOW" } + { $ STATUS_PRIVILEGED_INSTRUCTION "STATUS_PRIVILEGED_INSTRUCTION" } + { $ STATUS_STACK_OVERFLOW "STATUS_STACK_OVERFLOW" } + { $ STATUS_CONTROL_C_EXIT "STATUS_CONTROL_C_EXIT" } + } + +: seh-name. ( n -- ) + seh-names get at [ " (" ")" surround write ] when* ; + +M: windows signal-error. + "Windows exception 0x" write + third [ .h ] [ seh-name. ] bi nl ; diff --git a/basis/windows/kernel32/kernel32.factor b/basis/windows/kernel32/kernel32.factor index 70c104e2df..4cf93f7836 100755 --- a/basis/windows/kernel32/kernel32.factor +++ b/basis/windows/kernel32/kernel32.factor @@ -759,6 +759,32 @@ CONSTANT: PIPE_NOWAIT 1 CONSTANT: PIPE_UNLIMITED_INSTANCES 255 +CONSTANT: EXCEPTION_NONCONTINUABLE HEX: 1 +CONSTANT: STATUS_GUARD_PAGE_VIOLATION HEX: 80000001 +CONSTANT: STATUS_DATATYPE_MISALIGNMENT HEX: 80000002 +CONSTANT: STATUS_BREAKPOINT HEX: 80000003 +CONSTANT: STATUS_SINGLE_STEP HEX: 80000004 +CONSTANT: STATUS_ACCESS_VIOLATION HEX: C0000005 +CONSTANT: STATUS_IN_PAGE_ERROR HEX: C0000006 +CONSTANT: STATUS_INVALID_HANDLE HEX: C0000008 +CONSTANT: STATUS_NO_MEMORY HEX: C0000017 +CONSTANT: STATUS_ILLEGAL_INSTRUCTION HEX: C000001D +CONSTANT: STATUS_NONCONTINUABLE_EXCEPTION HEX: C0000025 +CONSTANT: STATUS_INVALID_DISPOSITION HEX: C0000026 +CONSTANT: STATUS_ARRAY_BOUNDS_EXCEEDED HEX: C000008C +CONSTANT: STATUS_FLOAT_DENORMAL_OPERAND HEX: C000008D +CONSTANT: STATUS_FLOAT_DIVIDE_BY_ZERO HEX: C000008E +CONSTANT: STATUS_FLOAT_INEXACT_RESULT HEX: C000008F +CONSTANT: STATUS_FLOAT_INVALID_OPERATION HEX: C0000090 +CONSTANT: STATUS_FLOAT_OVERFLOW HEX: C0000091 +CONSTANT: STATUS_FLOAT_STACK_CHECK HEX: C0000092 +CONSTANT: STATUS_FLOAT_UNDERFLOW HEX: C0000093 +CONSTANT: STATUS_INTEGER_DIVIDE_BY_ZERO HEX: C0000094 +CONSTANT: STATUS_INTEGER_OVERFLOW HEX: C0000095 +CONSTANT: STATUS_PRIVILEGED_INSTRUCTION HEX: C0000096 +CONSTANT: STATUS_STACK_OVERFLOW HEX: C00000FD +CONSTANT: STATUS_CONTROL_C_EXIT HEX: C000013A + LIBRARY: kernel32 ! FUNCTION: _hread ! FUNCTION: _hwrite diff --git a/vm/errors.cpp b/vm/errors.cpp index a1fc71ffbc..c587fa723a 100755 --- a/vm/errors.cpp +++ b/vm/errors.cpp @@ -112,7 +112,7 @@ void factor_vm::memory_protection_error(cell addr, stack_frame *native_stack) void factor_vm::signal_error(int signal, stack_frame *native_stack) { - general_error(ERROR_SIGNAL,tag_fixnum(signal),false_object,native_stack); + general_error(ERROR_SIGNAL,allot_cell(signal),false_object,native_stack); } void factor_vm::divide_by_zero_error() -- 2.34.1