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) | |
|
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"
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
c85776 | 1999-03-16 | Fredrik Hübinette (Hubbe) | | RCSID("$Id: error.c,v 1.25 1999/03/16 23:37:22 hubbe Exp $");
|
24ddc7 | 1998-03-28 | Henrik Grubbström (Grubba) | |
|
e9f914 | 1996-09-29 | Fredrik Hübinette (Hubbe) | | #undef ATTRIBUTE
#define ATTRIBUTE(X)
|
cb2256 | 1995-10-11 | Fredrik Hübinette (Hubbe) | | JMP_BUF *recoveries=0;
|
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;
#define TESTILITEST ((((char *)recoveries)-((char *)&foo))*STACK_DIRECTION)
if(recoveries && TESTILITEST > 0)
fatal("Recoveries is out biking (recoveries=%p, sp=%p, %d)!\n",recoveries, &foo,TESTILITEST);
}
#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
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | r->fp=fp;
|
f0cd98 | 1996-06-21 | Fredrik Hübinette (Hubbe) | | r->sp=sp-evaluator_stack;
r->mark_sp=mark_sp - mark_stack;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | r->previous=recoveries;
|
07513e | 1996-10-04 | Fredrik Hübinette (Hubbe) | | r->onerror=0;
|
61e9a0 | 1998-01-25 | Fredrik Hübinette (Hubbe) | | r->severity=THROW_ERROR;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | 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) | | {
|
61e9a0 | 1998-01-25 | Fredrik Hübinette (Hubbe) | | while(recoveries && throw_severity > recoveries->severity)
{
while(recoveries->onerror)
{
(*recoveries->onerror->func)(recoveries->onerror->arg);
recoveries->onerror=recoveries->onerror->previous;
}
recoveries=recoveries->previous;
}
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | if(!recoveries)
fatal("No error recovery context.\n");
|
71f3a2 | 1998-11-22 | Fredrik Hübinette (Hubbe) | | #ifdef PIKE_DEBUG
|
f0cd98 | 1996-06-21 | Fredrik Hübinette (Hubbe) | | if(sp - evaluator_stack < recoveries->sp)
|
294dc5 | 1997-08-03 | Fredrik Hübinette (Hubbe) | | fatal("Stack error in error.\n");
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | #endif
while(fp != recoveries->fp)
{
|
421801 | 1999-01-31 | Fredrik Hübinette (Hubbe) | | struct pike_frame *tmp=fp;
|
71f3a2 | 1998-11-22 | Fredrik Hübinette (Hubbe) | | #ifdef PIKE_DEBUG
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | if(!fp)
fatal("Popped out of stack frames.\n");
#endif
|
421801 | 1999-01-31 | Fredrik Hübinette (Hubbe) | | fp = tmp->next;
tmp->next=0;
free_pike_frame(tmp);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
|
f0cd98 | 1996-06-21 | Fredrik Hübinette (Hubbe) | | pop_n_elems(sp - evaluator_stack - recoveries->sp);
mark_sp = mark_stack + recoveries->mark_sp;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
07513e | 1996-10-04 | Fredrik Hübinette (Hubbe) | | while(recoveries->onerror)
|
cb2256 | 1995-10-11 | Fredrik Hübinette (Hubbe) | | {
|
07513e | 1996-10-04 | Fredrik Hübinette (Hubbe) | | (*recoveries->onerror->func)(recoveries->onerror->arg);
recoveries->onerror=recoveries->onerror->previous;
|
cb2256 | 1995-10-11 | Fredrik Hübinette (Hubbe) | | }
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | longjmp(recoveries->recovery,1);
}
|
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;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
4406cf | 1998-04-13 | Henrik Grubbström (Grubba) | | static const char *in_error;
|
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];
|
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) | |
|
dceabb | 1996-10-09 | Fredrik Hübinette (Hubbe) | | if(!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");
|
f52cf6 | 1998-04-10 | Henrik Grubbström (Grubba) | | push_error(buf);
free_svalue(& throw_value);
throw_value = *--sp;
throw_severity=THROW_ERROR;
in_error=0;
pike_throw();
}
|
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;
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;
if(!recoveries)
{
|
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);
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);
|
864d3c | 1998-01-29 | Fredrik Hübinette (Hubbe) | | throw_value = *--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)
{
|
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);
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();
}
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
(void)VFPRINTF(stderr, fmt, args);
|
ef7c76 | 1998-03-24 | Fredrik Hübinette (Hubbe) | |
d_flag=t_flag=0;
|
f52cf6 | 1998-04-10 | Henrik Grubbström (Grubba) | | push_error("Attempting to dump backlog (may fail).\n");
|
ef7c76 | 1998-03-24 | Fredrik Hübinette (Hubbe) | | APPLY_MASTER("describe_backtrace",1);
if(sp[-1].type==T_STRING)
write_to_stderr(sp[-1].u.string->str, sp[-1].u.string->len);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | fflush(stderr);
abort();
}
|
c85776 | 1999-03-16 | Fredrik Hübinette (Hubbe) | |
#if 0
struct mapping va_generic_error(const char *fmt, va_list args)
{
char buf[8192];
#ifdef HAVE_VSNPRINTF
vsnprintf(buf, sizeof(buf)-1, fmt, args);
#else /* !HAVE_VSNPRINTF */
VSPRINTF(buf, fmt, args);
if((long)strlen(buf) >= (long)sizeof(buf))
fatal("Buffer overflow in error()\n");
#endif /* HAVE_VSNPRINTF */
push_error(buf);
free_svalue(& throw_value);
throw_value = *--sp;
throw_severity=THROW_ERROR;
in_error=0;
pike_throw();
}
struct generic_error
{
struct pike_string *s;
struct array *backtrace;
}
struct program *generic_error_program;
void init_error()
{
start_new_program();
ADD_STORAGE(struct generic_error);
ADD_FUNCTION("describe",f_error_backtrace,tFunc(tVoid,tString),0);
ADD_FUNCTION("backtrace",f_error_backtrace,tFunc(tVoid,tArr(tMixed)),0);
add_integer_constant("is_generic_error",1,0);
add_string_constant("error_type","generic_error",0);
generic_error_program=end_program();
start_new_program();
do_inherit(generic_error, 0, 0, 0, 0, 0);
add_integer_constant("is_index_error",1,0);
add_string_constant("error_type", "index_error",0);
index_error_program=end_program();
start_new_program();
end_new_program();
}
#endif
|