diff --git a/src/error.c b/src/error.c
index d915b83f8097336fd5f2a9ab3b2e59dcc5960d82..f33e898b44dfaa271ad5b404871697fd01ab38b8 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.164 2008/07/16 00:33:59 mast Exp $
+|| $Id: error.c,v 1.165 2008/10/04 17:17:14 mast Exp $
 */
 
 #define NO_PIKE_SHORTHAND
@@ -359,23 +359,29 @@ PMOD_EXPORT void Pike_vsnprintf(char *str, size_t size,
 }
 
 
-void DECLSPEC(noreturn) va_error(const char *fmt, va_list args)
-     ATTRIBUTE((noreturn))
+PMOD_EXPORT void va_make_error (const char *fmt, va_list args)
 {
   struct string_builder s;
+  init_string_builder(&s, 0);
+  string_builder_vsprintf(&s, fmt, args);
+  push_string(finish_string_builder(&s));
+  f_backtrace(0);
+  f_aggregate(2);
+}
 
+PMOD_EXPORT void DECLSPEC(noreturn) va_error(const char *fmt, va_list args)
+  ATTRIBUTE((noreturn))
+{
   SWAP_IN_THREAD_IF_REQUIRED();
   if(in_error)
   {
     const char *tmp=in_error;
     in_error = NULL;
-    Pike_fatal("Recursive error() calls, original error: %s, new error: %s",
-	       tmp, fmt);
+    Pike_fatal("Recursive Pike_error() calls, "
+	       "original error: %s, new error: %s", tmp, fmt);
   }
 
   in_error=fmt;
-  init_string_builder(&s, 0);
-  string_builder_vsprintf(&s, fmt, args);
 
   if(!Pike_interpreter.recoveries)
   {
@@ -391,9 +397,7 @@ void DECLSPEC(noreturn) va_error(const char *fmt, va_list args)
     exit(99);
   }
 
-  push_string(finish_string_builder(&s));
-  f_backtrace(0);
-  f_aggregate(2);
+  va_make_error (fmt, args);
   free_svalue(&throw_value);
   move_svalue(&throw_value, --Pike_sp);
   throw_severity = THROW_ERROR;
@@ -401,6 +405,24 @@ void DECLSPEC(noreturn) va_error(const char *fmt, va_list args)
   pike_throw();	/* Hope someone is catching, or we will be out of balls. */
 }
 
+PMOD_EXPORT void make_error (const char *fmt, ...)
+/* Creates a general error container like Pike_error but doesn't throw
+ * it, instead it is left on the stack. */
+{
+  va_list args;
+  va_start (args,fmt);
+  va_make_error (fmt,args);
+  va_end (args);
+}
+
+PMOD_EXPORT DECLSPEC(noreturn) void Pike_error(const char *fmt,...) ATTRIBUTE((noreturn))
+{
+  va_list args;
+  va_start(args,fmt);
+  va_error(fmt,args);
+  va_end(args);
+}
+
 PMOD_EXPORT DECLSPEC(noreturn) void new_error(const char *name,
 					      const char *text,
 					      struct svalue *oldsp,
@@ -556,14 +578,6 @@ PMOD_EXPORT void fatal_on_error(const void *msg)
   do_abort();
 }
 
-PMOD_EXPORT DECLSPEC(noreturn) void Pike_error(const char *fmt,...) ATTRIBUTE((noreturn))
-{
-  va_list args;
-  va_start(args,fmt);
-  va_error(fmt,args);
-  va_end(args);
-}
-
 PMOD_EXPORT DECLSPEC(noreturn) void debug_va_fatal(const char *fmt, va_list args) ATTRIBUTE((noreturn))
 {
   static int in_fatal = 0;
diff --git a/src/pike_error.h b/src/pike_error.h
index 2fc52078b1cc637f6216b2089fe01227a40f949a..cf4697e58647604b2b719596cf53f940822c06fa 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.48 2008/05/30 10:54:12 mast Exp $
+|| $Id: pike_error.h,v 1.49 2008/10/04 17:17:14 mast Exp $
 */
 
 #ifndef PIKE_ERROR_H
@@ -248,12 +248,14 @@ PMOD_EXPORT DECLSPEC(noreturn) void pike_throw(void) ATTRIBUTE((noreturn));
 PMOD_EXPORT void push_error(const char *description);
 PMOD_EXPORT DECLSPEC(noreturn) void low_error(const char *buf) ATTRIBUTE((noreturn));
 PMOD_EXPORT void Pike_vsnprintf(char *str, size_t size, const char *fmt, va_list ap);
-void DECLSPEC(noreturn) va_error(const char *fmt, va_list args) ATTRIBUTE((noreturn));
+PMOD_EXPORT void va_make_error (const char *fmt, va_list args);
+PMOD_EXPORT void DECLSPEC(noreturn) va_error(const char *fmt, va_list args) ATTRIBUTE((noreturn));
+PMOD_EXPORT void make_error (const char *fmt, ...);
+PMOD_EXPORT DECLSPEC(noreturn) void Pike_error(const char *fmt,...) ATTRIBUTE((noreturn));
 PMOD_EXPORT DECLSPEC(noreturn) void new_error(const char *name, const char *text, struct svalue *oldsp,
 	       INT32 args, const char *file, int line) ATTRIBUTE((noreturn));
 PMOD_EXPORT void exit_on_error(const void *msg);
 PMOD_EXPORT void fatal_on_error(const void *msg);
-PMOD_EXPORT DECLSPEC(noreturn) void Pike_error(const char *fmt,...) ATTRIBUTE((noreturn));
 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,