cb2256 | 1995-10-11 | Fredrik Hübinette (Hubbe) | | |
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | ||| This file a part of Pike, and is copyright by Fredrik Hubinette
||| Pike is distributed as GPL (General Public License)
|
cb2256 | 1995-10-11 | Fredrik Hübinette (Hubbe) | | ||| See the files COPYING and DISCLAIMER for more information.
\*/
|
2f748a | 1999-02-20 | Henrik Grubbström (Grubba) | |
|
be9ba1 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | #define NO_PIKE_SHORTHAND
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | #include "global.h"
|
bb55f8 | 1997-03-16 | Fredrik Hübinette (Hubbe) | | #include "pike_macros.h"
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | #include "error.h"
#include "interpret.h"
#include "stralloc.h"
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | #include "builtin_functions.h"
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | #include "array.h"
#include "object.h"
|
ef7c76 | 1998-03-24 | Fredrik Hübinette (Hubbe) | | #include "main.h"
#include "builtin_functions.h"
|
c08c8b | 1998-04-05 | Fredrik Hübinette (Hubbe) | | #include "backend.h"
|
4406cf | 1998-04-13 | Henrik Grubbström (Grubba) | | #include "operators.h"
|
81299f | 1999-03-19 | Fredrik Hübinette (Hubbe) | | #include "module_support.h"
|
db40ab | 1999-04-15 | Fredrik Hübinette (Hubbe) | | #include "threads.h"
|
20513c | 2000-04-12 | Fredrik Hübinette (Hubbe) | | #include "gc.h"
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
be9ba1 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | RCSID("$Id: error.c,v 1.54 2000/07/07 01:43:32 hubbe Exp $");
|
24ddc7 | 1998-03-28 | Henrik Grubbström (Grubba) | |
|
e9f914 | 1996-09-29 | Fredrik Hübinette (Hubbe) | | #undef ATTRIBUTE
#define ATTRIBUTE(X)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
c85776 | 1999-03-16 | Fredrik Hübinette (Hubbe) | | #ifdef PIKE_DEBUG
void check_recovery_context(void)
{
char foo;
|
fc26f6 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | #define TESTILITEST ((((char *)Pike_interpreter.recoveries)-((char *)&foo))*STACK_DIRECTION)
if(Pike_interpreter.recoveries && TESTILITEST > 0)
fatal("Recoveries is out biking (Pike_interpreter.recoveries=%p, Pike_sp=%p, %d)!\n",Pike_interpreter.recoveries, &foo,TESTILITEST);
|
c85776 | 1999-03-16 | Fredrik Hübinette (Hubbe) | |
}
|
20f7a0 | 2000-03-20 | Fredrik Hübinette (Hubbe) | |
void pike_gdb_breakpoint(void)
{
}
|
c85776 | 1999-03-16 | Fredrik Hübinette (Hubbe) | | #endif
|
5196c5 | 1998-07-16 | Fredrik Hübinette (Hubbe) | | JMP_BUF *init_recovery(JMP_BUF *r DEBUG_LINE_ARGS)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
c85776 | 1999-03-16 | Fredrik Hübinette (Hubbe) | | check_recovery_context();
|
71f3a2 | 1998-11-22 | Fredrik Hübinette (Hubbe) | | #ifdef PIKE_DEBUG
|
5196c5 | 1998-07-16 | Fredrik Hübinette (Hubbe) | | r->line=line;
r->file=file;
|
c85776 | 1999-03-16 | Fredrik Hübinette (Hubbe) | | OED_FPRINTF((stderr, "init_recovery(%p) %s:%d\n", r, file, line));
|
5196c5 | 1998-07-16 | Fredrik Hübinette (Hubbe) | | #endif
|
fc26f6 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | r->frame_pointer=Pike_fp;
r->stack_pointer=Pike_sp-Pike_interpreter.evaluator_stack;
r->mark_sp=Pike_mark_sp - Pike_interpreter.mark_stack;
r->previous=Pike_interpreter.recoveries;
|
07513e | 1996-10-04 | Fredrik Hübinette (Hubbe) | | r->onerror=0;
|
61e9a0 | 1998-01-25 | Fredrik Hübinette (Hubbe) | | r->severity=THROW_ERROR;
|
fc26f6 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | Pike_interpreter.recoveries=r;
|
c85776 | 1999-03-16 | Fredrik Hübinette (Hubbe) | | check_recovery_context();
|
e9f914 | 1996-09-29 | Fredrik Hübinette (Hubbe) | | return r;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
|
5a7ab6 | 1998-01-31 | Fredrik Hübinette (Hubbe) | | void pike_throw(void) ATTRIBUTE((noreturn))
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
fc26f6 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | while(Pike_interpreter.recoveries && throw_severity > Pike_interpreter.recoveries->severity)
|
61e9a0 | 1998-01-25 | Fredrik Hübinette (Hubbe) | | {
|
fc26f6 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | while(Pike_interpreter.recoveries->onerror)
|
61e9a0 | 1998-01-25 | Fredrik Hübinette (Hubbe) | | {
|
fc26f6 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | (*Pike_interpreter.recoveries->onerror->func)(Pike_interpreter.recoveries->onerror->arg);
Pike_interpreter.recoveries->onerror=Pike_interpreter.recoveries->onerror->previous;
|
61e9a0 | 1998-01-25 | Fredrik Hübinette (Hubbe) | | }
|
fc26f6 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | Pike_interpreter.recoveries=Pike_interpreter.recoveries->previous;
|
61e9a0 | 1998-01-25 | Fredrik Hübinette (Hubbe) | | }
|
fc26f6 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | if(!Pike_interpreter.recoveries)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | fatal("No error recovery context.\n");
|
71f3a2 | 1998-11-22 | Fredrik Hübinette (Hubbe) | | #ifdef PIKE_DEBUG
|
fc26f6 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | if(Pike_sp - Pike_interpreter.evaluator_stack < Pike_interpreter.recoveries->stack_pointer)
|
294dc5 | 1997-08-03 | Fredrik Hübinette (Hubbe) | | fatal("Stack error in error.\n");
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | #endif
|
fc26f6 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | while(Pike_fp != Pike_interpreter.recoveries->frame_pointer)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
71f3a2 | 1998-11-22 | Fredrik Hübinette (Hubbe) | | #ifdef PIKE_DEBUG
|
fc26f6 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | if(!Pike_fp)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | fatal("Popped out of stack frames.\n");
#endif
|
424d9c | 1999-05-02 | Fredrik Hübinette (Hubbe) | | POP_PIKE_FRAME();
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
|
fc26f6 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | pop_n_elems(Pike_sp - Pike_interpreter.evaluator_stack - Pike_interpreter.recoveries->stack_pointer);
Pike_mark_sp = Pike_interpreter.mark_stack + Pike_interpreter.recoveries->mark_sp;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
fc26f6 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | while(Pike_interpreter.recoveries->onerror)
|
cb2256 | 1995-10-11 | Fredrik Hübinette (Hubbe) | | {
|
fc26f6 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | (*Pike_interpreter.recoveries->onerror->func)(Pike_interpreter.recoveries->onerror->arg);
Pike_interpreter.recoveries->onerror=Pike_interpreter.recoveries->onerror->previous;
|
cb2256 | 1995-10-11 | Fredrik Hübinette (Hubbe) | | }
|
fc26f6 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | longjmp(Pike_interpreter.recoveries->recovery,1);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
|
f52cf6 | 1998-04-10 | Henrik Grubbström (Grubba) | | void push_error(char *description)
{
push_text(description);
f_backtrace(0);
f_aggregate(2);
}
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | struct svalue throw_value = { T_INT };
|
61e9a0 | 1998-01-25 | Fredrik Hübinette (Hubbe) | | int throw_severity;
|
4406cf | 1998-04-13 | Henrik Grubbström (Grubba) | | static const char *in_error;
|
db40ab | 1999-04-15 | Fredrik Hübinette (Hubbe) | |
|
f4d9e7 | 1999-10-06 | Henrik Grubbström (Grubba) | | void low_error(char *buf) ATTRIBUTE((noreturn))
|
db40ab | 1999-04-15 | Fredrik Hübinette (Hubbe) | | {
push_error(buf);
free_svalue(& throw_value);
|
fc26f6 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | throw_value = *--Pike_sp;
|
cfa2e5 | 1999-12-07 | Henrik Grubbström (Grubba) | | throw_severity = THROW_ERROR;
|
db40ab | 1999-04-15 | Fredrik Hübinette (Hubbe) | | in_error=0;
pike_throw();
}
|
f52cf6 | 1998-04-10 | Henrik Grubbström (Grubba) | |
|
4406cf | 1998-04-13 | Henrik Grubbström (Grubba) | | void va_error(const char *fmt, va_list args) ATTRIBUTE((noreturn))
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
52cf14 | 1998-05-15 | Henrik Grubbström (Grubba) | | char buf[4096];
|
db40ab | 1999-04-15 | Fredrik Hübinette (Hubbe) | | SWAP_IN_THREAD_IF_REQUIRED();
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | if(in_error)
{
|
4406cf | 1998-04-13 | Henrik Grubbström (Grubba) | | const char *tmp=in_error;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | in_error=0;
|
5fe7a7 | 1995-11-06 | Fredrik Hübinette (Hubbe) | | fatal("Recursive error() calls, original error: %s",tmp);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
|
5fe7a7 | 1995-11-06 | Fredrik Hübinette (Hubbe) | | in_error=buf;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
52cf14 | 1998-05-15 | Henrik Grubbström (Grubba) | | #ifdef HAVE_VSNPRINTF
|
f00ecc | 1998-05-16 | Fredrik Hübinette (Hubbe) | | vsnprintf(buf, 4090, fmt, args);
|
52cf14 | 1998-05-15 | Henrik Grubbström (Grubba) | | #else /* !HAVE_VSNPRINTF */
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | VSPRINTF(buf, fmt, args);
|
52cf14 | 1998-05-15 | Henrik Grubbström (Grubba) | | #endif /* HAVE_VSNPRINTF */
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
fc26f6 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | if(!Pike_interpreter.recoveries)
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | {
|
71f3a2 | 1998-11-22 | Fredrik Hübinette (Hubbe) | | #ifdef PIKE_DEBUG
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | dump_backlog();
#endif
|
dceabb | 1996-10-09 | Fredrik Hübinette (Hubbe) | | fprintf(stderr,"No error recovery context!\n%s",buf);
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | exit(99);
}
|
6b9216 | 1996-05-16 | Fredrik Hübinette (Hubbe) | | if((long)strlen(buf) >= (long)sizeof(buf))
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | fatal("Buffer overflow in error()\n");
|
db40ab | 1999-04-15 | Fredrik Hübinette (Hubbe) | | low_error(buf);
|
f52cf6 | 1998-04-10 | Henrik Grubbström (Grubba) | | }
|
4406cf | 1998-04-13 | Henrik Grubbström (Grubba) | | void new_error(const char *name, const char *text, struct svalue *oldsp,
INT32 args, const char *file, int line) ATTRIBUTE((noreturn))
|
f52cf6 | 1998-04-10 | Henrik Grubbström (Grubba) | | {
int i;
|
db40ab | 1999-04-15 | Fredrik Hübinette (Hubbe) | | ASSERT_THREAD_SWAPPED_IN();
|
f52cf6 | 1998-04-10 | Henrik Grubbström (Grubba) | | if(in_error)
{
|
4406cf | 1998-04-13 | Henrik Grubbström (Grubba) | | const char *tmp=in_error;
|
f52cf6 | 1998-04-10 | Henrik Grubbström (Grubba) | | in_error=0;
fatal("Recursive error() calls, original error: %s",tmp);
}
in_error=text;
|
fc26f6 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | if(!Pike_interpreter.recoveries)
|
f52cf6 | 1998-04-10 | Henrik Grubbström (Grubba) | | {
|
71f3a2 | 1998-11-22 | Fredrik Hübinette (Hubbe) | | #ifdef PIKE_DEBUG
|
f52cf6 | 1998-04-10 | Henrik Grubbström (Grubba) | | dump_backlog();
#endif
fprintf(stderr,"No error recovery context!\n%s():%s",name,text);
|
68581a | 2000-01-29 | Fredrik Hübinette (Hubbe) | | if(file)
fprintf(stderr,"at %s:%d\n",file,line);
|
f52cf6 | 1998-04-10 | Henrik Grubbström (Grubba) | | exit(99);
}
push_text(text);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | f_backtrace(0);
|
f52cf6 | 1998-04-10 | Henrik Grubbström (Grubba) | |
if (file) {
push_text(file);
push_int(line);
} else {
push_int(0);
push_int(0);
}
push_text(name);
for (i=-args; i; i++) {
push_svalue(oldsp + i);
}
f_aggregate(args + 3);
f_aggregate(1);
f_add(2);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | f_aggregate(2);
|
f52cf6 | 1998-04-10 | Henrik Grubbström (Grubba) | |
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | free_svalue(& throw_value);
|
fc26f6 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | throw_value = *--Pike_sp;
|
61e9a0 | 1998-01-25 | Fredrik Hübinette (Hubbe) | | throw_severity=THROW_ERROR;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
in_error=0;
|
dc7cc9 | 1998-01-14 | Fredrik Hübinette (Hubbe) | | pike_throw();
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
|
dceabb | 1996-10-09 | Fredrik Hübinette (Hubbe) | | void exit_on_error(void *msg)
{
|
56275c | 2000-04-16 | Fredrik Hübinette (Hubbe) | | ONERROR tmp;
SET_ONERROR(tmp,fatal_on_error,"Fatal in exit_on_error!");
|
111fdd | 2000-04-17 | Fredrik Hübinette (Hubbe) | | d_flag=0;
|
56275c | 2000-04-16 | Fredrik Hübinette (Hubbe) | |
|
05756c | 1999-08-24 | Fredrik Hübinette (Hubbe) | | fprintf(stderr,"%s\n",(char *)msg);
|
71f3a2 | 1998-11-22 | Fredrik Hübinette (Hubbe) | | #ifdef PIKE_DEBUG
|
dceabb | 1996-10-09 | Fredrik Hübinette (Hubbe) | | dump_backlog();
#endif
fprintf(stderr,"%s\n",(char *)msg);
|
05756c | 1999-08-24 | Fredrik Hübinette (Hubbe) | | #ifdef PIKE_DEBUG
{
char *s;
fprintf(stderr,"Attempting to dump raw error: (may fail)\n");
init_buf();
describe_svalue(&throw_value,0,0);
s=simple_free_buf();
fprintf(stderr,"%s\n",s);
free(s);
}
#endif
|
dceabb | 1996-10-09 | Fredrik Hübinette (Hubbe) | | exit(1);
}
void fatal_on_error(void *msg)
{
|
71f3a2 | 1998-11-22 | Fredrik Hübinette (Hubbe) | | #ifdef PIKE_DEBUG
|
dceabb | 1996-10-09 | Fredrik Hübinette (Hubbe) | | dump_backlog();
#endif
fprintf(stderr,"%s\n",(char *)msg);
abort();
}
|
4406cf | 1998-04-13 | Henrik Grubbström (Grubba) | | void error(const char *fmt,...) ATTRIBUTE((noreturn,format (printf, 1, 2)))
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
va_list args;
va_start(args,fmt);
va_error(fmt,args);
va_end(args);
}
|
4406cf | 1998-04-13 | Henrik Grubbström (Grubba) | | void debug_fatal(const char *fmt, ...) ATTRIBUTE((noreturn,format (printf, 1, 2)))
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
va_list args;
static int in_fatal = 0;
va_start(args,fmt);
if (in_fatal)
{
(void)VFPRINTF(stderr, fmt, args);
abort();
}
|
a3bcd7 | 2000-04-16 | Fredrik Hübinette (Hubbe) | |
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | in_fatal = 1;
|
71f3a2 | 1998-11-22 | Fredrik Hübinette (Hubbe) | | #ifdef PIKE_DEBUG
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | dump_backlog();
#endif
|
a3bcd7 | 2000-04-16 | Fredrik Hübinette (Hubbe) | | {
extern int Pike_in_gc;
if(Pike_in_gc)
{
fprintf(stderr,"Pike was in GC stage %d when this fatal occured:\n",Pike_in_gc);
Pike_in_gc=0;
}
|
9abad9 | 2000-04-17 | Martin Stjernholm | | }
|
a3bcd7 | 2000-04-16 | Fredrik Hübinette (Hubbe) | |
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | (void)VFPRINTF(stderr, fmt, args);
|
ef7c76 | 1998-03-24 | Fredrik Hübinette (Hubbe) | |
d_flag=t_flag=0;
|
fc26f6 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | if(Pike_sp && Pike_interpreter.evaluator_stack)
|
111fdd | 2000-04-17 | Fredrik Hübinette (Hubbe) | | {
fprintf(stderr,"Attempting to dump backlog (may fail)...\n");
push_error("Backtrace at time of fatal:\n");
APPLY_MASTER("describe_backtrace",1);
|
fc26f6 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | if(Pike_sp[-1].type==T_STRING)
write_to_stderr(Pike_sp[-1].u.string->str, Pike_sp[-1].u.string->len);
|
111fdd | 2000-04-17 | Fredrik Hübinette (Hubbe) | | }else{
fprintf(stderr,"No stack - no backtrace.\n");
}
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | fflush(stderr);
abort();
}
|
c85776 | 1999-03-16 | Fredrik Hübinette (Hubbe) | |
|
81299f | 1999-03-19 | Fredrik Hübinette (Hubbe) | | #if 1
|
c85776 | 1999-03-16 | Fredrik Hübinette (Hubbe) | |
|
81299f | 1999-03-19 | Fredrik Hübinette (Hubbe) | | #define ERR_DECLARE
#include "errors.h"
void f_error_cast(INT32 args)
{
char *s;
get_all_args("error->cast",args,"%s",&s);
if(!strncmp(s,"array",5))
{
pop_n_elems(args);
ref_push_string(GENERIC_ERROR_THIS->desc);
ref_push_array(GENERIC_ERROR_THIS->backtrace);
f_aggregate(2);
}else{
|
53a205 | 1999-10-06 | Henrik Grubbström (Grubba) | | SIMPLE_BAD_ARG_ERROR("error->cast", 1, "the value \"array\"");
|
81299f | 1999-03-19 | Fredrik Hübinette (Hubbe) | | }
}
void f_error_index(INT32 args)
{
int ind;
get_all_args("error->`[]",args,"%i",&ind);
switch(ind)
{
|
53a205 | 1999-10-06 | Henrik Grubbström (Grubba) | | case 0:
pop_n_elems(args);
ref_push_string(GENERIC_ERROR_THIS->desc);
break;
case 1:
pop_n_elems(args);
ref_push_array(GENERIC_ERROR_THIS->backtrace);
break;
|
81299f | 1999-03-19 | Fredrik Hübinette (Hubbe) | | default:
|
fc26f6 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | index_error("error->`[]", Pike_sp-args, args, NULL, Pike_sp-args,
|
53a205 | 1999-10-06 | Henrik Grubbström (Grubba) | | "Index %d is out of range 0 - 1.\n", ind);
break;
|
81299f | 1999-03-19 | Fredrik Hübinette (Hubbe) | | }
}
void f_error_describe(INT32 args)
{
pop_n_elems(args);
|
fc26f6 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | ref_push_object(Pike_fp->current_object);
|
81299f | 1999-03-19 | Fredrik Hübinette (Hubbe) | | APPLY_MASTER("describe_backtrace",1);
}
void f_error_backtrace(INT32 args)
{
pop_n_elems(args);
ref_push_array(GENERIC_ERROR_THIS->backtrace);
}
|
cfa2e5 | 1999-12-07 | Henrik Grubbström (Grubba) | | #ifdef ERROR_DEBUG
#define DWERROR(X) fprintf X
#else /* !ERROR_DEBUG */
#define DWERROR(X)
#endif /* ERROR_DEBUG */
|
81299f | 1999-03-19 | Fredrik Hübinette (Hubbe) | | #define INIT_ERROR(FEL)\
va_list foo; \
|
db40ab | 1999-04-15 | Fredrik Hübinette (Hubbe) | | struct object *o; \
va_start(foo,desc); \
ASSERT_THREAD_SWAPPED_IN(); \
|
cfa2e5 | 1999-12-07 | Henrik Grubbström (Grubba) | | o=low_clone(PIKE_CONCAT(FEL,_error_program)); \
DWERROR((stderr, "%s(): Throwing a " #FEL " error\n", func))
|
81299f | 1999-03-19 | Fredrik Hübinette (Hubbe) | |
#define ERROR_DONE(FOO) \
PIKE_CONCAT(FOO,_error_va(o,func, \
base_sp, args, \
desc,foo)); \
va_end(foo)
#define ERROR_STRUCT(STRUCT,O) \
((struct PIKE_CONCAT(STRUCT,_error_struct) *)((O)->storage + PIKE_CONCAT(STRUCT,_error_offset)))
#define ERROR_COPY(STRUCT,X) \
ERROR_STRUCT(STRUCT,o)->X=X
|
b4185e | 2000-04-04 | Henrik Grubbström (Grubba) | | #define ERROR_COPY_SVALUE(STRUCT,X) do { \
if (X) { \
assign_svalue_no_free( & ERROR_STRUCT(STRUCT,o)->X, X); \
} else { \
ERROR_STRUCT(STRUCT, o)->X.type = T_INT; \
ERROR_STRUCT(STRUCT, o)->X.subtype = 0; \
ERROR_STRUCT(STRUCT, o)->X.u.integer = 0; \
} \
} while (0)
|
81299f | 1999-03-19 | Fredrik Hübinette (Hubbe) | |
#define ERROR_COPY_REF(STRUCT,X) \
add_ref( ERROR_STRUCT(STRUCT,o)->X=X )
void generic_error_va(struct object *o,
char *func,
struct svalue *base_sp, int args,
char *fmt,
va_list foo)
ATTRIBUTE((noreturn))
|
c85776 | 1999-03-16 | Fredrik Hübinette (Hubbe) | | {
char buf[8192];
|
81299f | 1999-03-19 | Fredrik Hübinette (Hubbe) | | struct pike_string *desc;
struct array *backtrace;
int i;
|
c85776 | 1999-03-16 | Fredrik Hübinette (Hubbe) | |
#ifdef HAVE_VSNPRINTF
|
81299f | 1999-03-19 | Fredrik Hübinette (Hubbe) | | vsnprintf(buf, sizeof(buf)-1, fmt, foo);
|
c85776 | 1999-03-16 | Fredrik Hübinette (Hubbe) | | #else /* !HAVE_VSNPRINTF */
|
53a205 | 1999-10-06 | Henrik Grubbström (Grubba) | |
buf[sizeof(buf)-1] = '\0';
|
81299f | 1999-03-19 | Fredrik Hübinette (Hubbe) | | VSPRINTF(buf, fmt, foo);
|
c85776 | 1999-03-16 | Fredrik Hübinette (Hubbe) | |
|
53a205 | 1999-10-06 | Henrik Grubbström (Grubba) | | if(buf[sizeof(buf)-1])
|
c85776 | 1999-03-16 | Fredrik Hübinette (Hubbe) | | fatal("Buffer overflow in error()\n");
#endif /* HAVE_VSNPRINTF */
|
81299f | 1999-03-19 | Fredrik Hübinette (Hubbe) | | in_error=buf;
|
c85776 | 1999-03-16 | Fredrik Hübinette (Hubbe) | |
|
81299f | 1999-03-19 | Fredrik Hübinette (Hubbe) | | ERROR_STRUCT(generic,o)->desc=make_shared_string(buf);
f_backtrace(0);
if(func)
{
push_int(0);
push_int(0);
push_text(func);
|
e88b9e | 1999-04-02 | Fredrik Hübinette (Hubbe) | | for (i=0;i<args;i++)
|
81299f | 1999-03-19 | Fredrik Hübinette (Hubbe) | | push_svalue(base_sp + i);
f_aggregate(args + 3);
f_aggregate(1);
f_add(2);
}
|
c85776 | 1999-03-16 | Fredrik Hübinette (Hubbe) | |
|
fc26f6 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | if(Pike_sp[-1].type!=T_ARRAY)
|
81299f | 1999-03-19 | Fredrik Hübinette (Hubbe) | | fatal("Error failed to generate a backtrace!\n");
|
fc26f6 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | ERROR_STRUCT(generic,o)->backtrace=Pike_sp[-1].u.array;
Pike_sp--;
dmalloc_touch_svalue(Pike_sp);
|
81299f | 1999-03-19 | Fredrik Hübinette (Hubbe) | |
free_svalue(& throw_value);
throw_value.type=T_OBJECT;
throw_value.u.object=o;
|
a37338 | 1999-07-27 | Henrik Grubbström (Grubba) | | throw_severity = THROW_ERROR;
|
c85776 | 1999-03-16 | Fredrik Hübinette (Hubbe) | | in_error=0;
pike_throw();
}
|
81299f | 1999-03-19 | Fredrik Hübinette (Hubbe) | | void generic_error(
char *func,
struct svalue *base_sp, int args,
char *desc, ...) ATTRIBUTE((noreturn,format (printf, 4, 5)))
|
c85776 | 1999-03-16 | Fredrik Hübinette (Hubbe) | | {
|
81299f | 1999-03-19 | Fredrik Hübinette (Hubbe) | | INIT_ERROR(generic);
ERROR_DONE(generic);
|
c85776 | 1999-03-16 | Fredrik Hübinette (Hubbe) | | }
|
81299f | 1999-03-19 | Fredrik Hübinette (Hubbe) | | void index_error(
char *func,
struct svalue *base_sp, int args,
struct svalue *val,
struct svalue *ind,
char *desc, ...) ATTRIBUTE((noreturn,format (printf, 6, 7)))
{
INIT_ERROR(index);
ERROR_COPY_SVALUE(index, val);
ERROR_COPY_SVALUE(index, ind);
ERROR_DONE(generic);
}
|
c85776 | 1999-03-16 | Fredrik Hübinette (Hubbe) | |
|
81299f | 1999-03-19 | Fredrik Hübinette (Hubbe) | | void bad_arg_error(
char *func,
struct svalue *base_sp, int args,
int which_arg,
char *expected_type,
struct svalue *got,
char *desc, ...) ATTRIBUTE((noreturn,format (printf, 7, 8)))
|
c85776 | 1999-03-16 | Fredrik Hübinette (Hubbe) | | {
|
81299f | 1999-03-19 | Fredrik Hübinette (Hubbe) | | INIT_ERROR(bad_arg);
ERROR_COPY(bad_arg, which_arg);
ERROR_STRUCT(bad_arg,o)->expected_type=make_shared_string(expected_type);
if(got)
{
ERROR_COPY_SVALUE(bad_arg, got);
}else{
ERROR_STRUCT(bad_arg,o)->got.type=T_INT;
ERROR_STRUCT(bad_arg,o)->got.subtype=NUMBER_UNDEFINED;
ERROR_STRUCT(bad_arg,o)->got.u.integer=0;
}
|
cfa2e5 | 1999-12-07 | Henrik Grubbström (Grubba) | | DWERROR((stderr, "%s():Bad arg %d (expected %s)\n",
func, which_arg, expected_type));
|
81299f | 1999-03-19 | Fredrik Hübinette (Hubbe) | | ERROR_DONE(generic);
}
|
c85776 | 1999-03-16 | Fredrik Hübinette (Hubbe) | |
|
d0ed26 | 1999-03-20 | Fredrik Hübinette (Hubbe) | | void math_error(
char *func,
struct svalue *base_sp, int args,
|
28af0c | 1999-03-23 | Fredrik Hübinette (Hubbe) | | struct svalue *number,
|
b9f836 | 1999-03-23 | Fredrik Hübinette (Hubbe) | | char *desc, ...) ATTRIBUTE((noreturn,format (printf, 5, 6)))
|
d0ed26 | 1999-03-20 | Fredrik Hübinette (Hubbe) | | {
INIT_ERROR(math);
|
28af0c | 1999-03-23 | Fredrik Hübinette (Hubbe) | | if(number)
{
|
c023d5 | 1999-03-23 | Fredrik Hübinette (Hubbe) | | ERROR_COPY_SVALUE(math, number);
|
28af0c | 1999-03-23 | Fredrik Hübinette (Hubbe) | | }else{
|
c023d5 | 1999-03-23 | Fredrik Hübinette (Hubbe) | | ERROR_STRUCT(math,o)->number.type=T_INT;
ERROR_STRUCT(math,o)->number.subtype=NUMBER_UNDEFINED;
ERROR_STRUCT(math,o)->number.u.integer=0;
|
28af0c | 1999-03-23 | Fredrik Hübinette (Hubbe) | | }
|
d0ed26 | 1999-03-20 | Fredrik Hübinette (Hubbe) | | ERROR_DONE(generic);
}
void resource_error(
char *func,
struct svalue *base_sp, int args,
char *resource_type,
long howmuch,
char *desc, ...) ATTRIBUTE((noreturn,format (printf, 6, 7)))
{
INIT_ERROR(resource);
ERROR_COPY(resource,howmuch);
ERROR_STRUCT(resource,o)->resource_type=make_shared_string(resource_type);
ERROR_DONE(generic);
}
|
c85776 | 1999-03-16 | Fredrik Hübinette (Hubbe) | |
|
64dc4c | 1999-04-17 | Henrik Grubbström (Grubba) | | void permission_error(
char *func,
struct svalue *base_sp, int args,
char *permission_type,
|
424d9c | 1999-05-02 | Fredrik Hübinette (Hubbe) | | char *desc, ...) ATTRIBUTE((noreturn, format(printf, 5, 6)))
|
64dc4c | 1999-04-17 | Henrik Grubbström (Grubba) | | {
INIT_ERROR(permission);
ERROR_STRUCT(permission,o)->permission_type=
make_shared_string(permission_type);
ERROR_DONE(generic);
}
|
3a5b1d | 2000-05-24 | Fredrik Hübinette (Hubbe) | | void wrong_number_of_args_error(char *name, int args, int expected)
{
char *msg;
if(expected>args)
{
msg="Too few arguments";
}else{
msg="Too many arguments";
}
|
fc26f6 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | new_error(name, msg, Pike_sp-args, args, 0,0);
|
3a5b1d | 2000-05-24 | Fredrik Hübinette (Hubbe) | | }
|
20513c | 2000-04-12 | Fredrik Hübinette (Hubbe) | | #ifdef PIKE_DEBUG
static void gc_check_throw_value(struct callback *foo, void *bar, void *gazonk)
{
debug_gc_xmark_svalues(&throw_value,1," in the throw value");
}
#endif
|
81299f | 1999-03-19 | Fredrik Hübinette (Hubbe) | | void init_error(void)
{
#define ERR_SETUP
#include "errors.h"
|
20513c | 2000-04-12 | Fredrik Hübinette (Hubbe) | |
#ifdef PIKE_DEBUG
dmalloc_accept_leak(add_gc_callback(gc_check_throw_value,0,0));
#endif
|
81299f | 1999-03-19 | Fredrik Hübinette (Hubbe) | | }
|
c85776 | 1999-03-16 | Fredrik Hübinette (Hubbe) | |
|
81299f | 1999-03-19 | Fredrik Hübinette (Hubbe) | | void cleanup_error(void)
{
#define ERR_CLEANUP
#include "errors.h"
|
c85776 | 1999-03-16 | Fredrik Hübinette (Hubbe) | | }
#endif
|