diff --git a/src/error.c b/src/error.c
index 7dd6b074de979d642da26596912e79e25cfffeee..7ab6e69ab0adea77130e6dd05ab289e039342b9a 100644
--- a/src/error.c
+++ b/src/error.c
@@ -2,7 +2,7 @@
 || This file is part of Pike. For copyright information see COPYRIGHT.
 || Pike is distributed under GPL, LGPL and MPL. See the file COPYING
 || for more information.
-|| $Id: error.c,v 1.157 2008/05/27 15:59:17 mast Exp $
+|| $Id: error.c,v 1.158 2008/05/27 17:35:34 grubba Exp $
 */
 
 #define NO_PIKE_SHORTHAND
@@ -14,6 +14,7 @@
 #include "stralloc.h"
 #include "builtin_functions.h"
 #include "array.h"
+#include "mapping.h"
 #include "object.h"
 #include "main.h"
 #include "builtin_functions.h"
@@ -28,6 +29,8 @@
 #undef ATTRIBUTE
 #define ATTRIBUTE(X)
 
+/* #define ERROR_DEBUG */
+
 PMOD_EXPORT const char msg_fatal_error[] =
   "%s:%d: Fatal error:\n";
 #ifdef PIKE_DEBUG
@@ -61,6 +64,8 @@ PMOD_EXPORT const char msg_div_by_zero[] =
  */
 
 #ifdef PIKE_DEBUG
+/* struct mapping *recovery_lookup = NULL; */
+
 PMOD_EXPORT void check_recovery_context(void)
 {
   char foo;
@@ -68,11 +73,18 @@ PMOD_EXPORT void check_recovery_context(void)
   if(Pike_interpreter.recoveries &&
      Pike_interpreter.recoveries->on_stack &&
      TESTILITEST > 0) {
+    struct svalue *s;
     fprintf(stderr, "Recoveries is out biking (Pike_interpreter.recoveries=%p, Pike_sp=%p, %ld)!\n",
 	    Pike_interpreter.recoveries, &foo,
 	    DO_NOT_WARN((long)TESTILITEST));
-    fprintf(stderr, "Last recovery was added at %s\n",
-	    Pike_interpreter.recoveries->file);
+    fprintf(stderr, "Last recovery was added at %s:\n",
+	    Pike_interpreter.recoveries->file,
+	    Pike_interpreter.recoveries->line);
+    push_int((ptrdiff_t)Pike_interpreter.recoveries);
+/*     if ((s = low_mapping_lookup(recovery_lookup, Pike_sp-1))) { */
+/*       fprintf(stderr, "Try also looking at %s.\n", (char*)s->u.integer); */
+/*     } */
+    pop_stack();
     Pike_fatal("Recoveries is out biking (Pike_interpreter.recoveries=%p, C sp=%p, %ld)!\n",
 	  Pike_interpreter.recoveries, &foo,
 	  DO_NOT_WARN((long)TESTILITEST));
@@ -103,6 +115,14 @@ PMOD_EXPORT JMP_BUF *init_recovery(JMP_BUF *r, size_t stack_pop_levels DEBUG_INI
   r->severity=THROW_ERROR;
   Pike_interpreter.recoveries=r;
   check_recovery_context();
+#ifdef PIKE_DEBUG
+/*   if (recovery_lookup && Pike_sp) { */
+/*     push_int((ptrdiff_t)r); */
+/*     push_int((ptrdiff_t)location); */
+/*     mapping_insert(recovery_lookup, Pike_sp-2, Pike_sp-1); */
+/*     pop_n_elems(2); */
+/*   } */
+#endif
   return r;
 }
 
@@ -914,7 +934,7 @@ static void f_error_create(INT32 args)
 #define ERROR_DONE(FOO) \
   PIKE_CONCAT(FOO,_error_va(o,func, \
 			      base_sp,  args, \
-			      desc,&foo)); \
+			      desc,foo)); \
   va_end(foo)
 
 #define ERROR_STRUCT(STRUCT,O) \
@@ -950,7 +970,7 @@ static void f_error_create(INT32 args)
  */
 PMOD_EXPORT DECLSPEC(noreturn) void generic_error_va(
   struct object *o, const char *func, const struct svalue *base_sp, int args,
-  const char *fmt, va_list *fmt_args)
+  const char *fmt, va_list fmt_args)
 {
   struct generic_error_struct *err =
     (struct generic_error_struct *) get_storage (o, generic_error_program);
@@ -971,7 +991,7 @@ PMOD_EXPORT DECLSPEC(noreturn) void generic_error_va(
   if (fmt) {
     struct string_builder s;
     init_string_builder(&s, 0);
-    string_builder_vsprintf(&s, fmt, *fmt_args);
+    string_builder_vsprintf(&s, fmt, fmt_args);
 
 #if 0
     if (!master_program) {
@@ -1071,7 +1091,7 @@ PMOD_EXPORT DECLSPEC(noreturn) void bad_arg_error(
     ERROR_STRUCT(bad_argument,o)->expected_type = NULL;
   ERROR_COPY_SVALUE(bad_argument, got_value);
   DWERROR((stderr, "%s():Bad arg %d (expected %s)\n",
-	   func, which_arg, expected_type));
+	   func, which_argument, expected_type));
   ERROR_DONE(generic);
 }
 
@@ -1147,11 +1167,16 @@ void init_error(void)
 
 #ifdef PIKE_DEBUG
   dmalloc_accept_leak(add_gc_callback(gc_check_throw_value,0,0));
+
+/*   recovery_lookup = allocate_mapping(100); */
 #endif
 }
 
 void cleanup_error(void)
 {
+#ifdef PIKE_DEBUG
+/*   free_mapping(recovery_lookup); */
+#endif
 #define ERR_CLEANUP
 #include "errors.h"
 }
diff --git a/src/pike_error.h b/src/pike_error.h
index c1590c977b4294ee2d5d01aea7bbd79bda17e6ca..c5bef58f6601b954c868fe4c3ffd87a911f09a7e 100644
--- a/src/pike_error.h
+++ b/src/pike_error.h
@@ -2,7 +2,7 @@
 || This file is part of Pike. For copyright information see COPYRIGHT.
 || Pike is distributed under GPL, LGPL and MPL. See the file COPYING
 || for more information.
-|| $Id: pike_error.h,v 1.45 2008/05/27 15:59:17 mast Exp $
+|| $Id: pike_error.h,v 1.46 2008/05/27 17:35:34 grubba Exp $
 */
 
 #ifndef PIKE_ERROR_H
@@ -109,7 +109,7 @@ typedef struct ONERROR
 typedef struct JMP_BUF
 {
   struct JMP_BUF *previous;
-  LOW_JMP_BUF recovery;
+  volatile LOW_JMP_BUF recovery;
   struct pike_frame *frame_pointer;
   ptrdiff_t stack_pointer;
   ptrdiff_t mark_sp;
@@ -128,18 +128,19 @@ extern int throw_severity;
 #ifdef PIKE_DEBUG
 PMOD_EXPORT extern const char msg_unsetjmp_nosync_1[];
 PMOD_EXPORT extern const char msg_unsetjmp_nosync_2[];
-#define UNSETJMP(X) do{ \
-   check_recovery_context(); \
-   OED_FPRINTF((stderr, "unsetjmp(%p) %s:%d\n", \
-                &(X),  __FILE__, __LINE__)); \
-  if(Pike_interpreter.recoveries != &X) { \
-    if(Pike_interpreter.recoveries) \
-      Pike_fatal(msg_unsetjmp_nosync_1,Pike_interpreter.recoveries->file); \
-    else \
-      Pike_fatal(msg_unsetjmp_nosync_2); \
-    } \
-    Pike_interpreter.recoveries=X.previous; \
-   check_recovery_context(); \
+#define UNSETJMP(X) do{						\
+    check_recovery_context();					\
+    OED_FPRINTF((stderr, "unsetjmp(%p) %s:%d\n",		\
+		 &(X),  __FILE__, __LINE__));			\
+    if(Pike_interpreter.recoveries != &X) {			\
+      if(Pike_interpreter.recoveries)				\
+	Pike_fatal(msg_unsetjmp_nosync_1,			\
+		   Pike_interpreter.recoveries->file);		\
+      else							\
+	Pike_fatal(msg_unsetjmp_nosync_2);			\
+    }								\
+    Pike_interpreter.recoveries=X.previous;			\
+    check_recovery_context();					\
   }while (0)
 
 #ifdef DMALLOC_LOCATION
@@ -162,41 +163,42 @@ PMOD_EXPORT extern const char msg_unsetjmp_nosync_2[];
 
 
 #ifdef PIKE_DEBUG
-#define SET_ONERROR(X,Y,Z) \
-  do{ \
-     check_recovery_context(); \
-     OED_FPRINTF((stderr, "SET_ONERROR(%p, %p, %p) %s:%d\n", \
-                  &(X), (Y), (void *)(Z), __FILE__, __LINE__)); \
-     X.frame_pointer = Pike_interpreter.frame_pointer; \
-     X.func=(error_call)(Y); \
-     DO_IF_DMALLOC( if( X.func == free ) X.func=dmalloc_free;) \
-     X.arg=(void *)(Z); \
-     if(!Pike_interpreter.recoveries) break; \
-     X.previous=Pike_interpreter.recoveries->onerror; \
-     X.file = __FILE__; \
-     X.line = __LINE__; \
-     Pike_interpreter.recoveries->onerror=&X; \
+#define SET_ONERROR(X,Y,Z)					\
+  do{								\
+    check_recovery_context();					\
+    OED_FPRINTF((stderr, "SET_ONERROR(%p, %p, %p) %s:%d\n",	\
+		 &(X), (Y), (void *)(Z), __FILE__, __LINE__));	\
+    X.frame_pointer = Pike_interpreter.frame_pointer;		\
+    X.func=(error_call)(Y);					\
+    DO_IF_DMALLOC( if( X.func == free ) X.func=dmalloc_free);	\
+    X.arg=(void *)(Z);						\
+    if(!Pike_interpreter.recoveries) break;			\
+    X.previous=Pike_interpreter.recoveries->onerror;		\
+    X.file = __FILE__;						\
+    X.line = __LINE__;						\
+    Pike_interpreter.recoveries->onerror=&X;			\
   }while(0)
 
 PMOD_EXPORT extern const char msg_last_setjmp[];
 PMOD_EXPORT extern const char msg_unset_onerr_nosync_1[];
 PMOD_EXPORT extern const char msg_unset_onerr_nosync_2[];
-#define UNSET_ONERROR(X) do {\
-    check_recovery_context(); \
-    OED_FPRINTF((stderr, "UNSET_ONERROR(%p) %s:%d\n", \
-                 &(X), __FILE__, __LINE__)); \
-    if(!Pike_interpreter.recoveries) break; \
-    if(Pike_interpreter.recoveries->onerror != &(X)) { \
-      fprintf(stderr,msg_last_setjmp,Pike_interpreter.recoveries->file); \
-      if (Pike_interpreter.recoveries->onerror) { \
-	Pike_fatal(msg_unset_onerr_nosync_1,\
-	           Pike_interpreter.recoveries->onerror, &(X), \
+#define UNSET_ONERROR(X) do {					\
+    check_recovery_context();					\
+    OED_FPRINTF((stderr, "UNSET_ONERROR(%p) %s:%d\n",		\
+                 &(X), __FILE__, __LINE__));			\
+    if(!Pike_interpreter.recoveries) break;			\
+    if(Pike_interpreter.recoveries->onerror != &(X)) {		\
+      fprintf(stderr,msg_last_setjmp,				\
+	      Pike_interpreter.recoveries->file);		\
+      if (Pike_interpreter.recoveries->onerror) {		\
+	Pike_fatal(msg_unset_onerr_nosync_1,			\
+	           Pike_interpreter.recoveries->onerror, &(X),	\
                    Pike_interpreter.recoveries->onerror->file); \
-      } else { \
-        Pike_fatal(msg_unset_onerr_nosync_2); \
-      } \
-    } \
-    Pike_interpreter.recoveries->onerror=(X).previous; \
+      } else {							\
+        Pike_fatal(msg_unset_onerr_nosync_2);			\
+      }								\
+    }								\
+    Pike_interpreter.recoveries->onerror=(X).previous;		\
   } while(0)
 
 PMOD_EXPORT extern const char msg_assert_onerr[];
@@ -255,7 +257,7 @@ PMOD_EXPORT DECLSPEC(noreturn) void Pike_error(const char *fmt,...) ATTRIBUTE((n
 PMOD_EXPORT DECLSPEC(noreturn) void debug_fatal(const char *fmt, ...) ATTRIBUTE((noreturn));
 PMOD_EXPORT DECLSPEC(noreturn) void generic_error_va(
   struct object *o, const char *func, const struct svalue *base_sp, int args,
-  const char *fmt, va_list *fmt_args)
+  const char *fmt, va_list fmt_args)
   ATTRIBUTE((noreturn));
 PMOD_EXPORT DECLSPEC(noreturn) void throw_error_object(
   struct object *o,
@@ -331,6 +333,7 @@ PMOD_EXPORT extern const char msg_bad_arg_2[];
 PMOD_EXPORT extern const char msg_out_of_mem[];
 PMOD_EXPORT extern const char msg_out_of_mem_2[];
 
+#if 1
 static INLINE void DECLSPEC(noreturn) out_of_memory_error (
   const char *func,
   struct svalue *base_sp,  int args,
@@ -343,6 +346,15 @@ static INLINE void DECLSPEC(noreturn) out_of_memory_error (
   resource_error (func, base_sp, args, "memory", amount,
 		  amount ? msg_out_of_mem_2 : msg_out_of_mem, amount);
 }
+#else
+#define out_of_memory_error(FUNC, BASE_SP, ARGS, AMOUNT)	\
+  do {								\
+    size_t amount_ = (AMOUNT);					\
+    int args_ = (ARGS);						\
+    resource_error((FUNC), (BASE_SP), args_, "memory", amount_,	\
+		   msg_out_of_mem_2, amount_);			\
+  } while(0)
+#endif
 
 #define SIMPLE_OUT_OF_MEMORY_ERROR(FUNC, AMOUNT) \
    out_of_memory_error(FUNC, Pike_sp-args, args, AMOUNT)