e576bb | 2002-10-11 | Martin Nilsson | | |
e32e5b | 2003-04-02 | Martin Stjernholm | | || $Id: pike_error.h,v 1.31 2003/04/02 00:56:45 mast Exp $
|
e576bb | 2002-10-11 | Martin Nilsson | | */
|
3e7aa8 | 2000-11-30 | Fredrik Hübinette (Hubbe) | |
|
aad99b | 2001-03-28 | Fredrik Hübinette (Hubbe) | | #ifndef PIKE_ERROR_H
#define PIKE_ERROR_H
|
3e7aa8 | 2000-11-30 | Fredrik Hübinette (Hubbe) | |
|
e32e5b | 2003-04-02 | Martin Stjernholm | | #include <stdarg.h>
|
c17160 | 2003-04-01 | Martin Stjernholm | | #ifdef CONFIGURE_TEST
#include <stdio.h>
static inline void Pike_fatal (const char *fmt, ...)
{
va_list args;
va_start (args, fmt);
vfprintf (stderr, fmt, args);
abort();
}
#define Pike_error Pike_fatal
#else /* !CONFIGURE_TEST */
|
3e7aa8 | 2000-11-30 | Fredrik Hübinette (Hubbe) | | #include "machine.h"
#ifdef HAVE_SETJMP_H
#include <setjmp.h>
#undef HAVE_SETJMP_H
#endif
|
aad99b | 2001-03-28 | Fredrik Hübinette (Hubbe) | | #if 1
|
c29940 | 2001-11-10 | Martin Stjernholm | | PMOD_EXPORT extern const char msg_fatal_error[];
|
5aad93 | 2002-08-15 | Marcus Comstedt | | #define Pike_fatal \
|
c29940 | 2001-11-10 | Martin Stjernholm | | (fprintf(stderr,msg_fatal_error,__FILE__,__LINE__),debug_fatal)
|
aad99b | 2001-03-28 | Fredrik Hübinette (Hubbe) | | #else
|
5aad93 | 2002-08-15 | Marcus Comstedt | | #define Pike_fatal \
|
aad99b | 2001-03-28 | Fredrik Hübinette (Hubbe) | | (fprintf(stderr,"%s: Fatal error:\n",__FILE__ ":" DEFINETOSTR(__LINE__) ),debug_fatal)
#endif
|
fce470 | 2003-02-18 | Martin Stjernholm | | #ifndef NO_PIKE_SHORTHAND
#define fatal Pike_fatal
#endif
|
aad99b | 2001-03-28 | Fredrik Hübinette (Hubbe) | | PMOD_EXPORT DECLSPEC(noreturn) void debug_fatal(const char *fmt, ...) ATTRIBUTE((noreturn,format (printf, 1, 2)));
|
3e7aa8 | 2000-11-30 | Fredrik Hübinette (Hubbe) | | #include "svalue.h"
typedef void (*error_call)(void *);
#ifndef STRUCT_FRAME_DECLARED
#define STRUCT_FRAME_DECLARED
struct pike_frame;
#endif
#define THROW_ERROR 10
#define THROW_THREAD_EXIT 20
#define THROW_THREAD_KILLED 30
#define THROW_EXIT 40
#define THROW_MAX_SEVERITY 100
#ifdef ONERROR_DEBUG
#define OED_FPRINTF(X) fprintf X
#else /* !ONERROR_DEBUG */
#define OED_FPRINTF(X)
#endif /* ONERROR_DEBUG */
typedef struct ONERROR
{
struct ONERROR *previous;
error_call func;
void *arg;
#ifdef PIKE_DEBUG
const char *file;
int line;
#endif /* PIKE_DEBUG */
} ONERROR;
typedef struct JMP_BUF
{
struct JMP_BUF *previous;
jmp_buf recovery;
struct pike_frame *frame_pointer;
ptrdiff_t stack_pointer;
ptrdiff_t mark_sp;
INT32 severity;
ONERROR *onerror;
#ifdef PIKE_DEBUG
int line;
char *file;
#endif
} JMP_BUF;
|
f31ced | 2000-12-16 | Marcus Comstedt | | PMOD_EXPORT extern struct svalue throw_value;
|
3e7aa8 | 2000-11-30 | Fredrik Hübinette (Hubbe) | | extern int throw_severity;
#ifdef PIKE_DEBUG
|
c29940 | 2001-11-10 | Martin Stjernholm | | PMOD_EXPORT extern const char msg_unsetjmp_nosync_1[];
PMOD_EXPORT extern const char msg_unsetjmp_nosync_2[];
|
3e7aa8 | 2000-11-30 | Fredrik Hübinette (Hubbe) | | #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) \
|
5aad93 | 2002-08-15 | Marcus Comstedt | | Pike_fatal(msg_unsetjmp_nosync_1,Pike_interpreter.recoveries->file); \
|
3e7aa8 | 2000-11-30 | Fredrik Hübinette (Hubbe) | | else \
|
5aad93 | 2002-08-15 | Marcus Comstedt | | Pike_fatal(msg_unsetjmp_nosync_2); \
|
3e7aa8 | 2000-11-30 | Fredrik Hübinette (Hubbe) | | } \
Pike_interpreter.recoveries=X.previous; \
check_recovery_context(); \
}while (0)
|
38e1e8 | 2001-11-08 | Fredrik Hübinette (Hubbe) | |
#ifdef DMALLOC_LOCATION
#define PERR_LOCATION() DMALLOC_LOCATION()
#else
#define PERR_LOCATION() ( __FILE__ ":" DEFINETOSTR(__LINE__) )
#endif
#define DEBUG_LINE_ARGS ,char *location
|
b3d374 | 2002-11-23 | Martin Stjernholm | | #define SETJMP(X) setjmp((init_recovery(&X, 0, PERR_LOCATION())->recovery))
#define SETJMP_SP(jmp, stack_pop_levels) \
setjmp((init_recovery(&jmp, stack_pop_levels, PERR_LOCATION())->recovery))
|
3e7aa8 | 2000-11-30 | Fredrik Hübinette (Hubbe) | | #else
#define DEBUG_LINE_ARGS
|
b3d374 | 2002-11-23 | Martin Stjernholm | | #define SETJMP(X) setjmp((init_recovery(&X, 0)->recovery))
#define SETJMP_SP(jmp, stack_pop_levels) \
|
c2ffc3 | 2002-11-23 | Martin Stjernholm | | setjmp((init_recovery(&jmp, stack_pop_levels)->recovery))
|
3e7aa8 | 2000-11-30 | Fredrik Hübinette (Hubbe) | | #define UNSETJMP(X) Pike_interpreter.recoveries=X.previous
#endif
#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.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)
|
c29940 | 2001-11-10 | Martin Stjernholm | | 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[];
|
3e7aa8 | 2000-11-30 | Fredrik Hübinette (Hubbe) | | #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)) { \
|
c29940 | 2001-11-10 | Martin Stjernholm | | fprintf(stderr,msg_last_setjmp,Pike_interpreter.recoveries->file); \
|
3e7aa8 | 2000-11-30 | Fredrik Hübinette (Hubbe) | | if (Pike_interpreter.recoveries->onerror) { \
|
5aad93 | 2002-08-15 | Marcus Comstedt | | Pike_fatal(msg_unset_onerr_nosync_1,\
Pike_interpreter.recoveries->onerror, &(X), \
Pike_interpreter.recoveries->onerror->file); \
|
3e7aa8 | 2000-11-30 | Fredrik Hübinette (Hubbe) | | } else { \
|
5aad93 | 2002-08-15 | Marcus Comstedt | | Pike_fatal(msg_unset_onerr_nosync_2); \
|
3e7aa8 | 2000-11-30 | Fredrik Hübinette (Hubbe) | | } \
} \
Pike_interpreter.recoveries->onerror=(X).previous; \
} while(0)
|
c29940 | 2001-11-10 | Martin Stjernholm | | PMOD_EXPORT extern const char msg_assert_onerr[];
|
3e7aa8 | 2000-11-30 | Fredrik Hübinette (Hubbe) | | #define ASSERT_ONERROR(X) \
do{ \
if (!Pike_interpreter.recoveries) break; \
if (Pike_interpreter.recoveries->onerror != &X) { \
|
5aad93 | 2002-08-15 | Marcus Comstedt | | Pike_fatal(msg_assert_onerr, \
__FILE__, __LINE__, &(X)); \
|
3e7aa8 | 2000-11-30 | Fredrik Hübinette (Hubbe) | | } \
}while(0)
#else /* !PIKE_DEBUG */
#define SET_ONERROR(X,Y,Z) \
do{ \
X.func=(error_call)(Y); \
X.arg=(void *)(Z); \
if(!Pike_interpreter.recoveries) break; \
X.previous=Pike_interpreter.recoveries->onerror; \
Pike_interpreter.recoveries->onerror=&X; \
}while(0)
#define UNSET_ONERROR(X) Pike_interpreter.recoveries && (Pike_interpreter.recoveries->onerror=X.previous)
#define ASSERT_ONERROR(X)
#endif /* PIKE_DEBUG */
#define CALL_AND_UNSET_ONERROR(X) do { \
X.func(X.arg); \
UNSET_ONERROR(X); \
}while(0)
#if defined(PIKE_DEBUG) && 0
#define PIKE_ERROR(NAME, TEXT, SP, ARGS) new_error(NAME, TEXT, SP, ARGS, __FILE__, __LINE__);
#else
#define PIKE_ERROR(NAME, TEXT, SP, ARGS) new_error(NAME, TEXT, SP, ARGS, NULL, 0);
#endif /* PIKE_DEBUG */
|
f31ced | 2000-12-16 | Marcus Comstedt | | PMOD_EXPORT void check_recovery_context(void);
|
071adc | 2002-11-25 | Martin Stjernholm | | PMOD_EXPORT void pike_gdb_breakpoint(INT32 args);
|
b3d374 | 2002-11-23 | Martin Stjernholm | | PMOD_EXPORT JMP_BUF *init_recovery(JMP_BUF *r, size_t stack_pop_levels DEBUG_LINE_ARGS);
|
3e7aa8 | 2000-11-30 | Fredrik Hübinette (Hubbe) | | PMOD_EXPORT DECLSPEC(noreturn) void pike_throw(void) ATTRIBUTE((noreturn));
|
66a157 | 2001-01-12 | Martin Stjernholm | | PMOD_EXPORT void push_error(const char *description);
|
fcec35 | 2000-12-04 | Martin Stjernholm | | PMOD_EXPORT DECLSPEC(noreturn) void low_error(const char *buf) ATTRIBUTE((noreturn));
|
db57b1 | 2001-03-07 | Henrik Grubbström (Grubba) | | void DECLSPEC(noreturn) va_error(const char *fmt, va_list args) ATTRIBUTE((noreturn));
|
3e7aa8 | 2000-11-30 | Fredrik Hübinette (Hubbe) | | 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));
|
c29940 | 2001-11-10 | Martin Stjernholm | | PMOD_EXPORT void exit_on_error(const void *msg);
PMOD_EXPORT void fatal_on_error(const void *msg);
|
3e7aa8 | 2000-11-30 | Fredrik Hübinette (Hubbe) | | PMOD_EXPORT DECLSPEC(noreturn) void Pike_error(const char *fmt,...) ATTRIBUTE((noreturn,format (printf, 1, 2)));
PMOD_EXPORT DECLSPEC(noreturn) void debug_fatal(const char *fmt, ...) ATTRIBUTE((noreturn,format (printf, 1, 2)));
void DECLSPEC(noreturn) generic_error_va(struct object *o,
|
c29940 | 2001-11-10 | Martin Stjernholm | | const char *func,
|
3e7aa8 | 2000-11-30 | Fredrik Hübinette (Hubbe) | | struct svalue *base_sp, int args,
|
c29940 | 2001-11-10 | Martin Stjernholm | | const char *fmt,
|
3e7aa8 | 2000-11-30 | Fredrik Hübinette (Hubbe) | | va_list foo)
ATTRIBUTE((noreturn));
|
78283b | 2001-08-16 | Martin Stjernholm | | PMOD_EXPORT DECLSPEC(noreturn) void throw_error_object(
struct object *o,
|
c29940 | 2001-11-10 | Martin Stjernholm | | const char *func,
|
78283b | 2001-08-16 | Martin Stjernholm | | struct svalue *base_sp, int args,
|
c29940 | 2001-11-10 | Martin Stjernholm | | const char *desc, ...) ATTRIBUTE((noreturn,format (printf, 5, 6)));
|
f31ced | 2000-12-16 | Marcus Comstedt | | PMOD_EXPORT void DECLSPEC(noreturn) generic_error(
|
c29940 | 2001-11-10 | Martin Stjernholm | | const char *func,
|
3e7aa8 | 2000-11-30 | Fredrik Hübinette (Hubbe) | | struct svalue *base_sp, int args,
|
c29940 | 2001-11-10 | Martin Stjernholm | | const char *desc, ...) ATTRIBUTE((noreturn,format (printf, 4, 5)));
|
a7bd07 | 2000-12-18 | Fredrik Hübinette (Hubbe) | | PMOD_EXPORT DECLSPEC(noreturn) void index_error(
|
c29940 | 2001-11-10 | Martin Stjernholm | | const char *func,
|
3e7aa8 | 2000-11-30 | Fredrik Hübinette (Hubbe) | | struct svalue *base_sp, int args,
struct svalue *val,
struct svalue *ind,
|
c29940 | 2001-11-10 | Martin Stjernholm | | const char *desc, ...) ATTRIBUTE((noreturn,format (printf, 6, 7)));
|
a7bd07 | 2000-12-18 | Fredrik Hübinette (Hubbe) | | PMOD_EXPORT DECLSPEC(noreturn) void bad_arg_error(
|
c29940 | 2001-11-10 | Martin Stjernholm | | const char *func,
|
3e7aa8 | 2000-11-30 | Fredrik Hübinette (Hubbe) | | struct svalue *base_sp, int args,
int which_arg,
|
c29940 | 2001-11-10 | Martin Stjernholm | | const char *expected_type,
|
3e7aa8 | 2000-11-30 | Fredrik Hübinette (Hubbe) | | struct svalue *got,
|
c29940 | 2001-11-10 | Martin Stjernholm | | const char *desc, ...) ATTRIBUTE((noreturn,format (printf, 7, 8)));
|
f31ced | 2000-12-16 | Marcus Comstedt | | PMOD_EXPORT void DECLSPEC(noreturn) math_error(
|
c29940 | 2001-11-10 | Martin Stjernholm | | const char *func,
|
3e7aa8 | 2000-11-30 | Fredrik Hübinette (Hubbe) | | struct svalue *base_sp, int args,
struct svalue *number,
|
c29940 | 2001-11-10 | Martin Stjernholm | | const char *desc, ...) ATTRIBUTE((noreturn,format (printf, 5, 6)));
|
f31ced | 2000-12-16 | Marcus Comstedt | | PMOD_EXPORT void DECLSPEC(noreturn) resource_error(
|
c29940 | 2001-11-10 | Martin Stjernholm | | const char *func,
|
3e7aa8 | 2000-11-30 | Fredrik Hübinette (Hubbe) | | struct svalue *base_sp, int args,
|
c29940 | 2001-11-10 | Martin Stjernholm | | const char *resource_type,
|
3e7aa8 | 2000-11-30 | Fredrik Hübinette (Hubbe) | | size_t howmuch,
|
c29940 | 2001-11-10 | Martin Stjernholm | | const char *desc, ...) ATTRIBUTE((noreturn,format (printf, 6, 7)));
|
f31ced | 2000-12-16 | Marcus Comstedt | | PMOD_EXPORT void DECLSPEC(noreturn) permission_error(
|
c29940 | 2001-11-10 | Martin Stjernholm | | const char *func,
|
3e7aa8 | 2000-11-30 | Fredrik Hübinette (Hubbe) | | struct svalue *base_sp, int args,
|
c29940 | 2001-11-10 | Martin Stjernholm | | const char *permission_type,
const char *desc, ...) ATTRIBUTE((noreturn, format(printf, 5, 6)));
|
81aa52 | 2003-04-01 | Martin Stjernholm | | PMOD_EXPORT void wrong_number_of_args_error(const char *name, int args, int expected)
ATTRIBUTE((noreturn));
|
3e7aa8 | 2000-11-30 | Fredrik Hübinette (Hubbe) | | void init_error(void);
void cleanup_error(void);
|
a4a172 | 2000-12-05 | Per Hedbor | |
|
3e7aa8 | 2000-11-30 | Fredrik Hübinette (Hubbe) | |
|
4e30de | 2003-03-28 | Martin Stjernholm | |
|
c29940 | 2001-11-10 | Martin Stjernholm | | PMOD_EXPORT extern const char msg_bad_arg[];
|
4e30de | 2003-03-28 | Martin Stjernholm | | #define SIMPLE_ARG_TYPE_ERROR(FUNC, ARG, EXPECT) \
bad_arg_error(FUNC, Pike_sp-args, args, ARG, EXPECT, Pike_sp+ARG-1-args,\
msg_bad_arg, ARG, FUNC, EXPECT)
|
3e7aa8 | 2000-11-30 | Fredrik Hübinette (Hubbe) | | #define SIMPLE_BAD_ARG_ERROR(FUNC, ARG, EXPECT) \
bad_arg_error(FUNC, Pike_sp-args, args, ARG, EXPECT, Pike_sp+ARG-1-args,\
|
4e30de | 2003-03-28 | Martin Stjernholm | | msg_bad_arg, ARG, FUNC, EXPECT)
|
3e7aa8 | 2000-11-30 | Fredrik Hübinette (Hubbe) | |
|
4e30de | 2003-03-28 | Martin Stjernholm | |
PMOD_EXPORT extern const char msg_bad_arg_2[];
#define SIMPLE_ARG_ERROR(FUNC, ARG, PROBLEM) \
|
81aa52 | 2003-04-01 | Martin Stjernholm | | bad_arg_error (FUNC, Pike_sp-args, args, ARG, NULL, Pike_sp+ARG-1-args, \
msg_bad_arg_2, ARG, FUNC, PROBLEM)
|
ba15e0 | 2003-03-28 | Martin Stjernholm | |
#define SIMPLE_WRONG_NUM_ARGS_ERROR(FUNC, ARG) \
|
4e30de | 2003-03-28 | Martin Stjernholm | | wrong_number_of_args_error (FUNC, args, ARG)
#define SIMPLE_TOO_FEW_ARGS_ERROR(FUNC, ARG) \
wrong_number_of_args_error (FUNC, args, ARG)
|
3e7aa8 | 2000-11-30 | Fredrik Hübinette (Hubbe) | |
|
c29940 | 2001-11-10 | Martin Stjernholm | | PMOD_EXPORT extern const char msg_out_of_mem[];
|
3e7aa8 | 2000-11-30 | Fredrik Hübinette (Hubbe) | | #define SIMPLE_OUT_OF_MEMORY_ERROR(FUNC, AMOUNT) \
|
c29940 | 2001-11-10 | Martin Stjernholm | | resource_error(FUNC, Pike_sp-args, args, "memory", AMOUNT, msg_out_of_mem)
|
3e7aa8 | 2000-11-30 | Fredrik Hübinette (Hubbe) | |
|
c29940 | 2001-11-10 | Martin Stjernholm | | PMOD_EXPORT extern const char msg_div_by_zero[];
|
3e7aa8 | 2000-11-30 | Fredrik Hübinette (Hubbe) | | #define SIMPLE_DIVISION_BY_ZERO_ERROR(FUNC) \
|
c29940 | 2001-11-10 | Martin Stjernholm | | math_error(FUNC, Pike_sp-args, args, 0, msg_div_by_zero)
|
3e7aa8 | 2000-11-30 | Fredrik Hübinette (Hubbe) | |
#ifndef PIKE_DEBUG
#define check_recovery_context() ((void)0)
#endif
#define exception_try \
do \
{ \
int __exception_rethrow, __is_exception; \
JMP_BUF exception; \
__is_exception = SETJMP(exception); \
__exception_rethrow = 0; \
if(__is_exception) /* rethrow needs this */ \
UNSETJMP(exception); \
if(!__is_exception)
#define exception_catch_if \
else if
#define exception_catch(e) \
exception_catch_if(exception->severity = (e))
#define exception_catch_all \
exception_catch_if(1)
#define exception_semicatch_all \
exception_catch_if((__exception_rethrow = 1))
#define rethrow \
pike_throw()
#define exception_endtry \
else \
__exception_rethrow = 1; \
|
c1b8f0 | 2001-07-02 | Martin Stjernholm | | if(__is_exception) { \
free_svalue(&throw_value); \
throw_value.type = T_INT; \
} \
else \
|
3e7aa8 | 2000-11-30 | Fredrik Hübinette (Hubbe) | | UNSETJMP(exception); \
if(__exception_rethrow) \
rethrow; \
} \
while(0)
|
a4a172 | 2000-12-05 | Per Hedbor | |
|
3e7aa8 | 2000-11-30 | Fredrik Hübinette (Hubbe) | | #define ERR_EXT_DECLARE
#include "errors.h"
|
c17160 | 2003-04-01 | Martin Stjernholm | | #endif /* !CONFIGURE_TEST */
|
aad99b | 2001-03-28 | Fredrik Hübinette (Hubbe) | | #endif /* PIKE_ERROR_H */
|