X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fruntime%2Fwin32-os.c;h=8cdc8320fbbcc3fb5f5abd91396317e18aff0c2a;hb=371577a214ce2659c271279ad48e4c42e1c0c93e;hp=394ed3eb2fe448ee51bd871aaba91248e11c76ad;hpb=4f86979ad00797600929481bc01c08e00de266a1;p=sbcl.git diff --git a/src/runtime/win32-os.c b/src/runtime/win32-os.c index 394ed3e..8cdc832 100644 --- a/src/runtime/win32-os.c +++ b/src/runtime/win32-os.c @@ -51,16 +51,6 @@ #include #include -/* KLUDGE: Avoid double definition of boolean by rpcndr.h included via - * shlobj.h. - * - * FIXME: We should probably arrange to use the rpcndr.h boolean on Windows, - * or get rid of our own boolean type. - */ -#define boolean rpcndr_boolean -#include -#undef boolean - #include #include @@ -308,6 +298,17 @@ is_valid_lisp_addr(os_vm_address_t addr) /* A tiny bit of interrupt.c state we want our paws on. */ extern boolean internal_errors_enabled; +#ifdef LISP_FEATURE_UD2_BREAKPOINTS +#define IS_TRAP_EXCEPTION(exception_record, context) \ + (((exception_record)->ExceptionCode == EXCEPTION_ILLEGAL_INSTRUCTION) && \ + (((unsigned short *)((context)->Eip))[0] == 0x0b0f)) +#define TRAP_CODE_WIDTH 2 +#else +#define IS_TRAP_EXCEPTION(exception_record, context) \ + ((exception_record)->ExceptionCode == EXCEPTION_BREAKPOINT) +#define TRAP_CODE_WIDTH 1 +#endif + /* * A good explanation of the exception handling semantics is * http://win32assembly.online.fr/Exceptionhandling.html . @@ -340,15 +341,15 @@ handle_exception(EXCEPTION_RECORD *exception_record, return ExceptionContinueExecution; } - if (exception_record->ExceptionCode == EXCEPTION_BREAKPOINT) { - unsigned char trap; + if (IS_TRAP_EXCEPTION(exception_record, context)) { + unsigned char trap; /* This is just for info in case the monitor wants to print an * approximation. */ current_control_stack_pointer = (lispobj *)*os_context_sp_addr(context); /* Unlike some other operating systems, Win32 leaves EIP * pointing to the breakpoint instruction. */ - context->Eip++; + context->Eip += TRAP_CODE_WIDTH; /* Now EIP points just after the INT3 byte and aims at the * 'kind' value (eg trap_Cerror). */ trap = *(unsigned char *)(*os_context_pc_addr(context)); @@ -428,7 +429,7 @@ handle_exception(EXCEPTION_RECORD *exception_record, _clearfp(); /* Call into lisp to handle things. */ - funcall2(SymbolFunction(HANDLE_WIN32_EXCEPTION), context_sap, + funcall2(StaticSymbolFunction(HANDLE_WIN32_EXCEPTION), context_sap, exception_record_sap); /* If Lisp doesn't nlx, we need to put things back. */ @@ -550,14 +551,9 @@ void scratch(void) _get_osfhandle(0); _pipe(0,0,0); access(0,0); - acos(0); - asin(0); close(0); - cosh(0); dup(0); - hypot(0, 0); isatty(0); - sinh(0); strerror(42); write(0, 0, 0); RtlUnwind(0, 0, 0, 0);