1.0.1.1:
[sbcl.git] / src / runtime / win32-os.c
index 9f945e8..b77f4ea 100644 (file)
 #include <sys/time.h>
 #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 <excpt.h>
 
@@ -57,7 +68,6 @@
 #include "thread.h"
 size_t os_vm_page_size;
 
-
 #include "gc.h"
 #include "gencgc-internal.h"
 
@@ -282,7 +292,7 @@ is_valid_lisp_addr(os_vm_address_t addr)
     struct thread *th;
     if(in_range_p(addr, READ_ONLY_SPACE_START, READ_ONLY_SPACE_SIZE) ||
        in_range_p(addr, STATIC_SPACE_START   , STATIC_SPACE_SIZE) ||
-       in_range_p(addr, DYNAMIC_SPACE_START  , DYNAMIC_SPACE_SIZE))
+       in_range_p(addr, DYNAMIC_SPACE_START  , dynamic_space_size))
         return 1;
     for_each_thread(th) {
         if(((os_vm_address_t)th->control_stack_start <= addr) && (addr < (os_vm_address_t)th->control_stack_end))
@@ -324,8 +334,9 @@ extern boolean internal_errors_enabled;
  * unwinding in Lisp.
  */
 
-EXCEPTION_DISPOSITION sigtrap_emulator(CONTEXT *context,
-                                       struct lisp_exception_frame *exception_frame)
+EXCEPTION_DISPOSITION
+sigtrap_emulator(CONTEXT *context,
+                 struct lisp_exception_frame *exception_frame)
 {
     if (*((char *)context->Eip + 1) == trap_ContextRestore) {
         /* This is the cleanup for what is immediately below, and
@@ -414,19 +425,26 @@ void sigtrap_wrapper(void)
 /*     set_seh_frame(handler.handler[0]); */
 }
 
-EXCEPTION_DISPOSITION handle_exception(EXCEPTION_RECORD *exception_record,
-                                       struct lisp_exception_frame *exception_frame,
-                                       CONTEXT *context,
-                                       void *dc) /* FIXME: What's dc again? */
+EXCEPTION_DISPOSITION
+handle_exception(EXCEPTION_RECORD *exception_record,
+                 struct lisp_exception_frame *exception_frame,
+                 CONTEXT *context,
+                 void *dc) /* FIXME: What's dc again? */
 {
-
     /* For EXCEPTION_ACCESS_VIOLATION only. */
     void *fault_address = (void *)exception_record->ExceptionInformation[1];
 
+    if (single_stepping &&
+        exception_record->ExceptionCode == EXCEPTION_SINGLE_STEP) {
+        /* We are doing a displaced instruction. At least function
+         * end breakpoints uses this. */
+        restore_breakpoint_from_single_step(context);
+        return ExceptionContinueExecution;
+    }
+
     if (exception_record->ExceptionCode == EXCEPTION_BREAKPOINT) {
         /* Pick off sigtrap case first. */
         return sigtrap_emulator(context, exception_frame);
-
     }
     else if (exception_record->ExceptionCode == EXCEPTION_ACCESS_VIOLATION &&
              (is_valid_lisp_addr(fault_address) ||
@@ -628,6 +646,8 @@ char *dirname(char *path)
 
 /* This is a manually-maintained version of ldso_stubs.S. */
 
+void __stdcall RtlUnwind(void *, void *, void *, void *); /* I don't have winternl.h */
+
 void scratch(void)
 {
     CloseHandle(0);
@@ -664,6 +684,7 @@ void scratch(void)
     sinh(0);
     strerror(42);
     write(0, 0, 0);
+    RtlUnwind(0, 0, 0, 0);
     #ifndef LISP_FEATURE_SB_UNICODE
       CreateDirectoryA(0,0);
       GetComputerNameA(0, 0);