#include <sys/stat.h>
#include <unistd.h>
-/* 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 <shlobj.h>
-#undef boolean
-
#include <math.h>
#include <float.h>
/* 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 .
return ExceptionContinueExecution;
}
- if (exception_record->ExceptionCode == EXCEPTION_BREAKPOINT) {
+ if (IS_TRAP_EXCEPTION(exception_record, context)) {
unsigned char trap;
/* This is just for info in case the monitor wants to print an
* approximation. */
(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));
_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. */
_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);