0.6.12.49:
[sbcl.git] / src / runtime / interr.c
index 26d2611..a5f8650 100644 (file)
  * files for more information.
  */
 
-/*
- * $Header$
- */
-
 #include <stdio.h>
 #include <stdarg.h>
 
@@ -43,7 +39,7 @@ set_lossage_handler(void handler(void))
     lossage_handler = handler;
 }
 
-void
+never_returns
 lose(char *fmt, ...)
 {
     va_list ap;
@@ -57,6 +53,8 @@ lose(char *fmt, ...)
     fprintf(stderr, "\n");
     fflush(stderr);
     lossage_handler();
+    fprintf(stderr, "Argh! lossage_handler() returned, total confusion..\n");
+    exit(1);
 }
 \f
 /* internal error handler for when the Lisp error system doesn't exist
@@ -154,6 +152,16 @@ describe_internal_error(os_context_t *context)
 
 lispobj debug_print(lispobj string)
 {
-    fprintf(stderr, "%s\n", (char *)(((struct vector *)PTR(string))->data));
+    /* This is a kludge.  It's not actually safe - in general - to use 
+       %primitive print on the alpha, because it skips half of the
+       number stack setup that should usually be done on a function call,
+       so the called routine (i.e. this one) ends up being able to overwrite
+       local variables in the caller.  Rather than fix this everywhere
+       that %primitive print is used (it's only a debugging aid anyway)
+       we just put guarantee our safety by putting an unused buffer on
+       the stack before doing anything else here */
+    char untouched[32]; /* GCC warns about not using this, but that's the point.. */
+    fprintf(stderr, "%s\n", 
+           (char *)(((struct vector *)native_pointer(string))->data),untouched);
     return NIL;
 }