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,