e576bb | 2002-10-11 | Martin Nilsson | | |
987ef4 | 2007-06-17 | Martin Stjernholm | | || $Id: error.c,v 1.149 2007/06/16 23:52:52 mast Exp $
|
e576bb | 2002-10-11 | Martin Nilsson | | */
|
aedfb1 | 2002-10-09 | Martin Nilsson | |
|
be9ba1 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | #define NO_PIKE_SHORTHAND
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | #include "global.h"
|
aad99b | 2001-03-28 | Fredrik Hübinette (Hubbe) | | #include "svalue.h"
|
bb55f8 | 1997-03-16 | Fredrik Hübinette (Hubbe) | | #include "pike_macros.h"
|
b2d3e4 | 2000-12-01 | Fredrik Hübinette (Hubbe) | | #include "pike_error.h"
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | #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) | |
|
8a28fd | 2004-05-19 | Martin Nilsson | |
|
e9f914 | 1996-09-29 | Fredrik Hübinette (Hubbe) | | #undef ATTRIBUTE
#define ATTRIBUTE(X)
|
c29940 | 2001-11-10 | Martin Stjernholm | | PMOD_EXPORT const char msg_fatal_error[] =
"%s:%d: Fatal error:\n";
#ifdef PIKE_DEBUG
PMOD_EXPORT const char msg_unsetjmp_nosync_1[] =
"UNSETJMP out of sync! (last SETJMP at %s)!\n";
PMOD_EXPORT const char msg_unsetjmp_nosync_2[] =
"UNSETJMP out of sync! (Pike_interpreter.recoveries = 0)\n";
PMOD_EXPORT const char msg_last_setjmp[] =
"LAST SETJMP: %s\n";
PMOD_EXPORT const char msg_unset_onerr_nosync_1[] =
"UNSET_ONERROR out of sync (%p != %p).\n"
"Last SET_ONERROR is from %s\n";
PMOD_EXPORT const char msg_unset_onerr_nosync_2[] =
"UNSET_ONERROR out of sync. No Pike_interpreter.recoveries left.\n";
PMOD_EXPORT const char msg_assert_onerr[] =
"%s ASSERT_ONERROR(%p) failed\n";
#endif
PMOD_EXPORT const char msg_bad_arg[] =
|
91fd1d | 2003-01-04 | Martin Nilsson | | "Bad argument %d to %s(). Expected %s.\n";
|
4e30de | 2003-03-28 | Martin Stjernholm | | PMOD_EXPORT const char msg_bad_arg_2[] =
"Bad argument %d to %s(). %s\n";
|
c29940 | 2001-11-10 | Martin Stjernholm | | PMOD_EXPORT const char msg_out_of_mem[] =
"Out of memory.\n";
|
40d6ed | 2006-05-10 | Martin Stjernholm | | PMOD_EXPORT const char msg_out_of_mem_2[] =
"Out of memory - failed to allocate %"PRINTSIZET"d bytes.\n";
|
c29940 | 2001-11-10 | Martin Stjernholm | | PMOD_EXPORT const char msg_div_by_zero[] =
"Division by zero.\n";
|
15e5e9 | 2000-08-15 | Henrik Grubbström (Grubba) | |
|
c85776 | 1999-03-16 | Fredrik Hübinette (Hubbe) | | #ifdef PIKE_DEBUG
|
1f2133 | 2000-07-28 | Fredrik Hübinette (Hubbe) | | PMOD_EXPORT void check_recovery_context(void)
|
c85776 | 1999-03-16 | Fredrik Hübinette (Hubbe) | | {
char foo;
|
fc26f6 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | #define TESTILITEST ((((char *)Pike_interpreter.recoveries)-((char *)&foo))*STACK_DIRECTION)
|
ca176b | 2006-02-27 | Martin Stjernholm | | if(Pike_interpreter.recoveries &&
Pike_interpreter.recoveries->on_stack &&
TESTILITEST > 0) {
|
e0755c | 2000-08-15 | Henrik Grubbström (Grubba) | | fprintf(stderr, "Recoveries is out biking (Pike_interpreter.recoveries=%p, Pike_sp=%p, %ld)!\n",
Pike_interpreter.recoveries, &foo,
DO_NOT_WARN((long)TESTILITEST));
|
36fd7c | 2001-11-08 | Fredrik Hübinette (Hubbe) | | fprintf(stderr, "Last recovery was added at %s\n",
Pike_interpreter.recoveries->file);
|
b7d821 | 2006-03-25 | Henrik Grubbström (Grubba) | | Pike_fatal("Recoveries is out biking (Pike_interpreter.recoveries=%p, C sp=%p, %ld)!\n",
|
e0755c | 2000-08-15 | Henrik Grubbström (Grubba) | | Pike_interpreter.recoveries, &foo,
DO_NOT_WARN((long)TESTILITEST));
|
15e5e9 | 2000-08-15 | Henrik Grubbström (Grubba) | | }
|
c85776 | 1999-03-16 | Fredrik Hübinette (Hubbe) | |
}
|
5c6d38 | 2002-09-21 | Martin Stjernholm | | #endif
|
20f7a0 | 2000-03-20 | Fredrik Hübinette (Hubbe) | |
|
071adc | 2002-11-25 | Martin Stjernholm | | PMOD_EXPORT void pike_gdb_breakpoint(INT32 args)
|
20f7a0 | 2000-03-20 | Fredrik Hübinette (Hubbe) | | {
|
319484 | 2002-11-28 | Martin Stjernholm | | pop_n_elems(args);
|
20f7a0 | 2000-03-20 | Fredrik Hübinette (Hubbe) | | }
|
c85776 | 1999-03-16 | Fredrik Hübinette (Hubbe) | |
|
ca176b | 2006-02-27 | Martin Stjernholm | | PMOD_EXPORT JMP_BUF *init_recovery(JMP_BUF *r, size_t stack_pop_levels DEBUG_INIT_REC_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
|
36fd7c | 2001-11-08 | Fredrik Hübinette (Hubbe) | | r->file=location;
OED_FPRINTF((stderr, "init_recovery(%p) %s\n", r, location));
|
ca176b | 2006-02-27 | Martin Stjernholm | | r->on_stack = on_stack;
|
5196c5 | 1998-07-16 | Fredrik Hübinette (Hubbe) | | #endif
|
fc26f6 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | r->frame_pointer=Pike_fp;
|
b3d374 | 2002-11-23 | Martin Stjernholm | | r->stack_pointer=Pike_sp - stack_pop_levels - Pike_interpreter.evaluator_stack;
|
fc26f6 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | 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) | | }
|
c4c6db | 2000-08-21 | Henrik Grubbström (Grubba) | | PMOD_EXPORT DECLSPEC(noreturn) void pike_throw(void) ATTRIBUTE((noreturn))
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
01c63f | 2003-04-28 | Martin Stjernholm | | #ifdef TRACE_UNFINISHED_TYPE_FIELDS
accept_unfinished_type_fields++;
#endif
|
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) | | }
|
ca176b | 2006-02-27 | Martin Stjernholm | |
if (Pike_interpreter.catch_ctx &&
&Pike_interpreter.catch_ctx->recovery == Pike_interpreter.recoveries) {
struct catch_context *cc = Pike_interpreter.catch_ctx;
Pike_interpreter.catch_ctx = cc->prev;
really_free_catch_context (cc);
}
|
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)
|
5aad93 | 2002-08-15 | Marcus Comstedt | | Pike_fatal("No error recovery context.\n");
|
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_sp - Pike_interpreter.evaluator_stack < Pike_interpreter.recoveries->stack_pointer)
|
5aad93 | 2002-08-15 | Marcus Comstedt | | Pike_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)
|
5aad93 | 2002-08-15 | Marcus Comstedt | | Pike_fatal("Popped out of stack frames.\n");
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | #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) | | }
|
36fd7c | 2001-11-08 | Fredrik Hübinette (Hubbe) | | #if defined(DEBUG_MALLOC) && defined(PIKE_DEBUG)
if(throw_value.type <= MAX_REF_TYPE)
{
debug_malloc_update_location(throw_value.u.refs,
Pike_interpreter.recoveries->file);
debug_malloc_touch(throw_value.u.refs);
}
#endif
|
01c63f | 2003-04-28 | Martin Stjernholm | | #ifdef TRACE_UNFINISHED_TYPE_FIELDS
accept_unfinished_type_fields--;
#endif
|
ca176b | 2006-02-27 | Martin Stjernholm | | if (Pike_interpreter.catch_ctx &&
&Pike_interpreter.catch_ctx->recovery == Pike_interpreter.recoveries) {
#ifdef PIKE_DEBUG
if (!Pike_interpreter.catching_eval_jmpbuf)
Pike_fatal ("Got phony F_CATCH recovery but no catching_eval_jmpbuf.\n");
#endif
LOW_LONGJMP (*Pike_interpreter.catching_eval_jmpbuf, 1);
}
else
LOW_LONGJMP(Pike_interpreter.recoveries->recovery,1);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
|
66a157 | 2001-01-12 | Martin Stjernholm | | PMOD_EXPORT void push_error(const char *description)
|
f52cf6 | 1998-04-10 | Henrik Grubbström (Grubba) | | {
push_text(description);
f_backtrace(0);
f_aggregate(2);
}
|
2fbeae | 2001-07-01 | Martin Stjernholm | | PMOD_EXPORT struct svalue throw_value = {
PIKE_T_INT, 0,
#ifdef HAVE_UNION_INIT
{0},
#endif
};
|
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) | |
|
fcec35 | 2000-12-04 | Martin Stjernholm | | PMOD_EXPORT DECLSPEC(noreturn) void low_error(const char *buf) ATTRIBUTE((noreturn))
|
db40ab | 1999-04-15 | Fredrik Hübinette (Hubbe) | | {
push_error(buf);
free_svalue(& throw_value);
|
c62145 | 2003-11-14 | Martin Stjernholm | | move_svalue (&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();
}
|
a9d102 | 2004-06-29 | Martin Nilsson | | PMOD_EXPORT void Pike_vsnprintf(char *str, size_t size,
|
a842e7 | 2004-06-29 | Henrik Grubbström (Grubba) | | const char *fmt, va_list args)
|
a9d102 | 2004-06-29 | Martin Nilsson | | {
size--;
do {
if(fmt[0]=='%') {
fmt++;
switch( fmt++[0] ) {
case 'O':
{
dynamic_buffer buf;
dynbuf_string s;
char *ostr;
|
dde49e | 2004-06-29 | Martin Nilsson | | struct svalue t = va_arg(args, struct svalue);
|
a9d102 | 2004-06-29 | Martin Nilsson | | init_buf(&buf);
|
dde49e | 2004-06-29 | Martin Nilsson | | describe_svalue(&t,0,0);
|
a9d102 | 2004-06-29 | Martin Nilsson | | s=complex_free_buf(&buf);
ostr=s.str;
while( --size>0 && (s.len--)>0 )
str++[0]=s.str++[0];
free(ostr);
}
break;
case 'S':
{
dynamic_buffer buf;
dynbuf_string s;
char *ostr;
struct svalue t;
t.type = PIKE_T_STRING;
t.u.string = va_arg(args, struct pike_string *);
init_buf(&buf);
describe_svalue(&t,0,0);
s=complex_free_buf(&buf);
ostr=s.str;
while( --size>0 && (s.len--)>0 )
str++[0]=s.str++[0];
free(ostr);
}
break;
case 's':
{
char *from = va_arg(args, char *);
while( --size>0 && from[0]!=0 )
str++[0]=from++[0];
}
break;
case 'c':
{
int c = (char)va_arg(args, int);
sprintf(str, "%c", c);
str++;
size--;
}
break;
case 'd':
{
char buf[12];
int pos=0;
sprintf(buf, "%d", va_arg(args, int));
while( --size>0 && buf[pos]!=0 )
str++[0]=buf[pos++];
}
break;
|
c55191 | 2004-11-05 | Martin Stjernholm | | case 'x':
{
char buf[12];
int pos=0;
sprintf(buf, "%x", va_arg(args, int));
while( --size>0 && buf[pos]!=0 )
str++[0]=buf[pos++];
}
break;
|
a9d102 | 2004-06-29 | Martin Nilsson | | case '%':
str++[0]='%';
size--;
break;
default:
Pike_fatal("Unknown Pike_vsnprintf formatting char '%c'.\n",
(fmt-1)[0]);
}
}
else {
str++[0]=fmt++[0];
size--;
}
} while(fmt[0] && size>0);
str[0]=0;
va_end(args);
}
|
d0f82b | 2004-11-11 | Henrik Grubbström (Grubba) | | void DECLSPEC(noreturn) va_error(const char *fmt, va_list args)
ATTRIBUTE((noreturn))
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
d0f82b | 2004-11-11 | Henrik Grubbström (Grubba) | | struct string_builder s;
|
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;
|
d0f82b | 2004-11-11 | Henrik Grubbström (Grubba) | | in_error = NULL;
|
f54c78 | 2004-12-22 | Henrik Grubbström (Grubba) | | Pike_fatal("Recursive error() calls, original error: %s, new error: %s",
tmp, fmt);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
|
d0f82b | 2004-11-11 | Henrik Grubbström (Grubba) | | in_error=fmt;
init_string_builder(&s, 0);
string_builder_vsprintf(&s, fmt, args);
|
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) | | {
|
d0f82b | 2004-11-11 | Henrik Grubbström (Grubba) | |
|
71f3a2 | 1998-11-22 | Fredrik Hübinette (Hubbe) | | #ifdef PIKE_DEBUG
|
c4670c | 2002-09-24 | Martin Stjernholm | | if (d_flag) {
|
d0f82b | 2004-11-11 | Henrik Grubbström (Grubba) | | fprintf(stderr,"No error recovery context!\n%s",s.s->str);
|
c4670c | 2002-09-24 | Martin Stjernholm | | dump_backlog();
}
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | #endif
|
d0f82b | 2004-11-11 | Henrik Grubbström (Grubba) | | fprintf(stderr,"No error recovery context!\n%s",s.s->str);
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | exit(99);
}
|
d0f82b | 2004-11-11 | Henrik Grubbström (Grubba) | | push_string(finish_string_builder(&s));
f_backtrace(0);
f_aggregate(2);
free_svalue(&throw_value);
move_svalue(&throw_value, --Pike_sp);
throw_severity = THROW_ERROR;
in_error = NULL;
pike_throw();
|
f52cf6 | 1998-04-10 | Henrik Grubbström (Grubba) | | }
|
d0f82b | 2004-11-11 | Henrik Grubbström (Grubba) | | 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))
|
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;
|
5aad93 | 2002-08-15 | Marcus Comstedt | | Pike_fatal("Recursive error() calls, original error: %s",tmp);
|
f52cf6 | 1998-04-10 | Henrik Grubbström (Grubba) | | }
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
|
c4670c | 2002-09-24 | Martin Stjernholm | | if (d_flag) {
|
2624d2 | 2003-07-30 | Martin Stjernholm | | fprintf(stderr,"No error recovery context!\n%s():%s",
name ? name : "<unknown>", text);
|
c4670c | 2002-09-24 | Martin Stjernholm | | dump_backlog();
}
|
f52cf6 | 1998-04-10 | Henrik Grubbström (Grubba) | | #endif
|
2624d2 | 2003-07-30 | Martin Stjernholm | | fprintf(stderr,"No error recovery context!\n%s():%s",
name ? name : "<unknown>", 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);
}
|
83bc4f | 2003-07-30 | Martin Stjernholm | |
if (name)
push_text(name);
else
push_int(0);
|
f52cf6 | 1998-04-10 | Henrik Grubbström (Grubba) | |
for (i=-args; i; i++) {
|
cbc062 | 2003-09-19 | Henrik Grubbström (Grubba) | | if (oldsp[i].type <= PIKE_T_FLOAT) {
push_svalue(oldsp + i);
} else {
char buffer[50];
sprintf(buffer, "<Svalue:0x%04x:0x%04x:%p>",
oldsp[i].type, oldsp[i].subtype, oldsp[i].u.ptr);
push_text(buffer);
}
|
f52cf6 | 1998-04-10 | Henrik Grubbström (Grubba) | | }
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) | |
|
d0f82b | 2004-11-11 | Henrik Grubbström (Grubba) | | free_svalue(&throw_value);
|
c62145 | 2003-11-14 | Martin Stjernholm | | move_svalue (&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) | | }
|
30def6 | 2004-06-01 | Martin Stjernholm | | static int inhibit_errors = 0;
|
c29940 | 2001-11-10 | Martin Stjernholm | | PMOD_EXPORT void exit_on_error(const void *msg)
|
dceabb | 1996-10-09 | Fredrik Hübinette (Hubbe) | | {
|
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;
|
30def6 | 2004-06-01 | Martin Stjernholm | | Pike_interpreter.trace_level = 0;
|
56275c | 2000-04-16 | Fredrik Hübinette (Hubbe) | |
|
30def6 | 2004-06-01 | Martin Stjernholm | | if (inhibit_errors)
fprintf (stderr, "Got recursive error in exit_on_error: %s\n", (char *) msg);
|
7c0df7 | 2001-02-06 | Henrik Grubbström (Grubba) | |
|
30def6 | 2004-06-01 | Martin Stjernholm | | else {
|
9fa0ee | 2003-11-09 | Martin Stjernholm | | dynamic_buffer save_buf;
|
05756c | 1999-08-24 | Fredrik Hübinette (Hubbe) | | char *s;
|
c8cdaf | 2003-07-16 | Martin Stjernholm | | struct svalue thrown;
|
30def6 | 2004-06-01 | Martin Stjernholm | |
inhibit_errors = 1;
#ifdef PIKE_DEBUG
if (d_flag) {
fprintf(stderr,"%s\n",(char *)msg);
dump_backlog();
}
#endif
fprintf(stderr,"%s\n",(char *)msg);
Pike_interpreter.svalue_stack_margin = 0;
Pike_interpreter.c_stack_margin = 0;
|
a4a172 | 2000-12-05 | Per Hedbor | | fprintf(stderr,"Attempting to dump raw error: (may fail)\n");
|
9fa0ee | 2003-11-09 | Martin Stjernholm | | init_buf(&save_buf);
|
c8cdaf | 2003-07-16 | Martin Stjernholm | | move_svalue (&thrown, &throw_value);
throw_value.type = PIKE_T_INT;
describe_svalue(&thrown,0,0);
free_svalue (&thrown);
|
9fa0ee | 2003-11-09 | Martin Stjernholm | | s=simple_free_buf(&save_buf);
|
05756c | 1999-08-24 | Fredrik Hübinette (Hubbe) | | fprintf(stderr,"%s\n",s);
free(s);
}
|
30def6 | 2004-06-01 | Martin Stjernholm | |
|
dceabb | 1996-10-09 | Fredrik Hübinette (Hubbe) | | exit(1);
}
|
47ebd3 | 2000-09-01 | Henrik Grubbström (Grubba) | | #ifdef __NT__
|
8919b2 | 2001-09-27 | Fredrik Hübinette (Hubbe) | | int fnordel=0;
|
47ebd3 | 2000-09-01 | Henrik Grubbström (Grubba) | | static void do_abort()
{
if (!d_flag && !getenv("PIKE_DEBUG")) {
|
7d24f7 | 2004-06-29 | Henrik Grubbström (Grubba) | | exit(-6);
|
47ebd3 | 2000-09-01 | Henrik Grubbström (Grubba) | | }
|
8919b2 | 2001-09-27 | Fredrik Hübinette (Hubbe) | | fnordel=999/fnordel;
|
47ebd3 | 2000-09-01 | Henrik Grubbström (Grubba) | | }
#else /* !__NT__ */
#define do_abort() abort()
#endif /* __NT__ */
|
c29940 | 2001-11-10 | Martin Stjernholm | | PMOD_EXPORT void fatal_on_error(const void *msg)
|
dceabb | 1996-10-09 | Fredrik Hübinette (Hubbe) | | {
|
64bf10 | 2002-03-26 | Martin Stjernholm | |
if (throw_severity == THROW_EXIT) return;
|
71f3a2 | 1998-11-22 | Fredrik Hübinette (Hubbe) | | #ifdef PIKE_DEBUG
|
c4670c | 2002-09-24 | Martin Stjernholm | | if (d_flag) {
fprintf(stderr,"%s\n",(char *)msg);
dump_backlog();
}
|
dceabb | 1996-10-09 | Fredrik Hübinette (Hubbe) | | #endif
fprintf(stderr,"%s\n",(char *)msg);
|
47ebd3 | 2000-09-01 | Henrik Grubbström (Grubba) | | do_abort();
|
dceabb | 1996-10-09 | Fredrik Hübinette (Hubbe) | | }
|
f38f28 | 2004-11-14 | Martin Stjernholm | | PMOD_EXPORT DECLSPEC(noreturn) void Pike_error(const char *fmt,...) ATTRIBUTE((noreturn))
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
va_list args;
va_start(args,fmt);
va_error(fmt,args);
va_end(args);
}
|
987ef4 | 2007-06-17 | Martin Stjernholm | | PMOD_EXPORT DECLSPEC(noreturn) void debug_va_fatal(const char *fmt, va_list args) ATTRIBUTE((noreturn))
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
static int in_fatal = 0;
|
a5cd6a | 2001-09-24 | Henrik Grubbström (Grubba) | |
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
if (in_fatal)
{
|
987ef4 | 2007-06-17 | Martin Stjernholm | | if (fmt) (void)VFPRINTF(stderr, fmt, args);
|
47ebd3 | 2000-09-01 | Henrik Grubbström (Grubba) | | do_abort();
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
|
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
|
c4670c | 2002-09-24 | Martin Stjernholm | | if (d_flag) {
|
987ef4 | 2007-06-17 | Martin Stjernholm | | if (fmt) (void)VFPRINTF(stderr, fmt, args);
|
c4670c | 2002-09-24 | Martin Stjernholm | | dump_backlog();
}
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | #endif
|
987ef4 | 2007-06-17 | Martin Stjernholm | | if (fmt) (void)VFPRINTF(stderr, fmt, args);
|
1216c4 | 2001-12-09 | Martin Stjernholm | | if(Pike_in_gc)
|
987ef4 | 2007-06-17 | Martin Stjernholm | | fprintf(stderr,"Pike was in GC stage %d when this fatal occured.\n",Pike_in_gc);
|
1216c4 | 2001-12-09 | Martin Stjernholm | | Pike_in_gc = GC_PASS_DISABLED;
|
a3bcd7 | 2000-04-16 | Fredrik Hübinette (Hubbe) | |
|
97ebb3 | 2003-01-09 | Henrik Grubbström (Grubba) | | d_flag=Pike_interpreter.trace_level=0;
|
8d0142 | 2004-09-18 | Henrik Grubbström (Grubba) | |
|
f75ff9 | 2002-03-10 | Martin Stjernholm | | if(Pike_sp && Pike_interpreter.evaluator_stack &&
master_object && master_object->prog)
|
111fdd | 2000-04-17 | Fredrik Hübinette (Hubbe) | | {
|
01b244 | 2004-02-09 | Martin Stjernholm | | JMP_BUF jmp;
struct callback_list saved_eval_cbs = evaluator_callbacks;
low_init_threads_disable();
MEMSET (&evaluator_callbacks, 0, sizeof (evaluator_callbacks));
if (SETJMP (jmp))
fprintf(stderr,"Got exception when trying to describe backtrace.\n");
else {
jmp.severity = THROW_EXIT;
push_error("Backtrace at time of fatal:\n");
APPLY_MASTER("describe_backtrace",1);
if(Pike_sp[-1].type==PIKE_T_STRING)
write_to_stderr(Pike_sp[-1].u.string->str, Pike_sp[-1].u.string->len);
}
UNSETJMP (jmp);
exit_threads_disable (NULL);
evaluator_callbacks = saved_eval_cbs;
|
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);
|
47ebd3 | 2000-09-01 | Henrik Grubbström (Grubba) | | do_abort();
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
|
c85776 | 1999-03-16 | Fredrik Hübinette (Hubbe) | |
|
987ef4 | 2007-06-17 | Martin Stjernholm | | PMOD_EXPORT DECLSPEC(noreturn) void debug_fatal(const char *fmt, ...) ATTRIBUTE((noreturn))
{
va_list args;
va_start(args,fmt);
debug_va_fatal (fmt, args);
va_end (args);
}
|
81299f | 1999-03-19 | Fredrik Hübinette (Hubbe) | | #if 1
|
c85776 | 1999-03-16 | Fredrik Hübinette (Hubbe) | |
|
2e7de8 | 2002-12-07 | Henrik Grubbström (Grubba) | |
|
c59b92 | 2004-04-20 | Martin Nilsson | | *! Something that was thrown. Usually an @[Error.Generic] object, or
|
2e7de8 | 2002-12-07 | Henrik Grubbström (Grubba) | | *! an array with the following content:
*! @array
*! @elem string msg
*! Error message.
*! @elem array(backtrace_frame|array(mixed)) backtrace
*! Backtrace to the point where the exception occurred.
*! @endarray
*!
*! @returns
*! Returns a string describing the exeception.
*!
*! @note
*! Usually added by the initialization code the global name space
*! with @[add_constant()].
*!
*! @seealso
*! @[predef::describe_backtrace()]
*/
|
c59b92 | 2004-04-20 | Martin Nilsson | |
|
7c0df7 | 2001-02-06 | Henrik Grubbström (Grubba) | | */
|
026959 | 2006-09-20 | Martin Stjernholm | |
|
81299f | 1999-03-19 | Fredrik Hübinette (Hubbe) | | #define ERR_DECLARE
#include "errors.h"
|
7c0df7 | 2001-02-06 | Henrik Grubbström (Grubba) | | |
cbe8c9 | 2003-04-07 | Martin Nilsson | | *! The only supported type to cast to is @expr{"array"@}, which
|
026959 | 2006-09-20 | Martin Stjernholm | | *! generates an old-style error @expr{({@[message](),
*! @[backtrace]()})@}.
|
7c0df7 | 2001-02-06 | Henrik Grubbström (Grubba) | | */
|
cec422 | 2001-08-16 | Martin Stjernholm | | static void f_error_cast(INT32 args)
|
81299f | 1999-03-19 | Fredrik Hübinette (Hubbe) | | {
char *s;
|
a4a172 | 2000-12-05 | Per Hedbor | | get_all_args("error->cast",args,"%s",&s);
|
81299f | 1999-03-19 | Fredrik Hübinette (Hubbe) | | if(!strncmp(s,"array",5))
{
pop_n_elems(args);
|
026959 | 2006-09-20 | Martin Stjernholm | | apply_current (generic_err_message_fun, 0);
apply_current (generic_err_backtrace_fun, 0);
|
81299f | 1999-03-19 | Fredrik Hübinette (Hubbe) | | f_aggregate(2);
}else{
|
a4a172 | 2000-12-05 | Per Hedbor | | SIMPLE_BAD_ARG_ERROR("error->cast", 1, "the value \"array\"");
|
81299f | 1999-03-19 | Fredrik Hübinette (Hubbe) | | }
}
|
7c0df7 | 2001-02-06 | Henrik Grubbström (Grubba) | | |
026959 | 2006-09-20 | Martin Stjernholm | | *! Error message as returned by @[message].
|
7c0df7 | 2001-02-06 | Henrik Grubbström (Grubba) | | *! @elem array backtrace
|
026959 | 2006-09-20 | Martin Stjernholm | | *! Backtrace as returned by @[backtrace].
|
7c0df7 | 2001-02-06 | Henrik Grubbström (Grubba) | | *! @endarray
*!
*! @note
*! The error message is always terminated with a newline.
*!
*! @seealso
*! @[backtrace()]
*/
|
cec422 | 2001-08-16 | Martin Stjernholm | | static void f_error_index(INT32 args)
|
81299f | 1999-03-19 | Fredrik Hübinette (Hubbe) | | {
|
65a549 | 2000-08-10 | Per Hedbor | | INT_TYPE ind;
|
a4a172 | 2000-12-05 | Per Hedbor | | get_all_args("error->`[]",args,"%i",&ind);
|
81299f | 1999-03-19 | Fredrik Hübinette (Hubbe) | |
switch(ind)
{
|
53a205 | 1999-10-06 | Henrik Grubbström (Grubba) | | case 0:
pop_n_elems(args);
|
026959 | 2006-09-20 | Martin Stjernholm | | apply_current (generic_err_message_fun, 0);
|
53a205 | 1999-10-06 | Henrik Grubbström (Grubba) | | break;
case 1:
pop_n_elems(args);
|
026959 | 2006-09-20 | Martin Stjernholm | | apply_current (generic_err_backtrace_fun, 0);
|
53a205 | 1999-10-06 | Henrik Grubbström (Grubba) | | break;
|
81299f | 1999-03-19 | Fredrik Hübinette (Hubbe) | | default:
|
a4a172 | 2000-12-05 | Per Hedbor | | index_error("error->`[]", Pike_sp-args, args, NULL, Pike_sp-args,
|
b99d88 | 2003-05-15 | Martin Stjernholm | | "Index %"PRINTPIKEINT"d is out of range 0..1.\n", ind);
|
53a205 | 1999-10-06 | Henrik Grubbström (Grubba) | | break;
|
81299f | 1999-03-19 | Fredrik Hübinette (Hubbe) | | }
}
|
7c0df7 | 2001-02-06 | Henrik Grubbström (Grubba) | | |
e86c8c | 2003-11-14 | Martin Stjernholm | | *! Return a readable error report that includes the backtrace.
|
7c0df7 | 2001-02-06 | Henrik Grubbström (Grubba) | | */
|
cec422 | 2001-08-16 | Martin Stjernholm | | static void f_error_describe(INT32 args)
|
81299f | 1999-03-19 | Fredrik Hübinette (Hubbe) | | {
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);
}
|
e86c8c | 2003-11-14 | Martin Stjernholm | | |
026959 | 2006-09-20 | Martin Stjernholm | | *! Return a readable message describing the error. Normally simply
*! returns @[error_message].
*!
*! If you override this function then you should ensure that
*! @[error_message] is included in the returned message, since there
*! might be code that catches your error objects, extends
*! @[error_message] with more info, and rethrows the error.
|
e86c8c | 2003-11-14 | Martin Stjernholm | | */
static void f_error_message(INT32 args)
{
pop_n_elems(args);
if (GENERIC_ERROR_THIS->error_message)
ref_push_string (GENERIC_ERROR_THIS->error_message);
else
push_int (0);
}
|
7c0df7 | 2001-02-06 | Henrik Grubbström (Grubba) | | |
026959 | 2006-09-20 | Martin Stjernholm | | *! Return the backtrace where the error occurred. Normally simply
*! returns @[error_backtrace].
|
7c0df7 | 2001-02-06 | Henrik Grubbström (Grubba) | | *!
*! @seealso
*! @[predef::backtrace()]
*/
|
cec422 | 2001-08-16 | Martin Stjernholm | | static void f_error_backtrace(INT32 args)
|
81299f | 1999-03-19 | Fredrik Hübinette (Hubbe) | | {
pop_n_elems(args);
|
e86c8c | 2003-11-14 | Martin Stjernholm | | if(GENERIC_ERROR_THIS->error_backtrace)
ref_push_array(GENERIC_ERROR_THIS->error_backtrace);
|
4eb01f | 2002-08-15 | Marcus Comstedt | | else
push_int(0);
|
81299f | 1999-03-19 | Fredrik Hübinette (Hubbe) | | }
|
cec422 | 2001-08-16 | Martin Stjernholm | |
static void f_error__sprintf(INT32 args)
{
struct program *p = Pike_fp->current_object->prog;
|
b9fee3 | 2003-08-20 | Henrik Grubbström (Grubba) | |
|
cec422 | 2001-08-16 | Martin Stjernholm | | int i = find_identifier("error_type", p);
struct identifier *id = ID_FROM_INT(p, i);
|
e6dbc2 | 2002-11-29 | Marcus Comstedt | | int mode = 0;
if(args>0 && Pike_sp[-args].type == PIKE_T_INT)
mode = Pike_sp[-args].u.integer;
|
cec422 | 2001-08-16 | Martin Stjernholm | | pop_n_elems(args);
|
e6dbc2 | 2002-11-29 | Marcus Comstedt | | if(mode != 'O') {
push_undefined();
return;
}
|
df019f | 2004-04-18 | Martin Stjernholm | | push_constant_text ("Error.");
|
cec422 | 2001-08-16 | Martin Stjernholm | | push_svalue(&PROG_FROM_INT(p, i)->constants[id->func.offset].sval);
push_constant_text("(%O)");
|
e86c8c | 2003-11-14 | Martin Stjernholm | | if(GENERIC_ERROR_THIS->error_message)
ref_push_string(GENERIC_ERROR_THIS->error_message);
|
4eb01f | 2002-08-15 | Marcus Comstedt | | else
push_int(0);
|
cec422 | 2001-08-16 | Martin Stjernholm | | f_sprintf(2);
|
df019f | 2004-04-18 | Martin Stjernholm | | f_add(3);
|
cec422 | 2001-08-16 | Martin Stjernholm | | }
|
738354 | 2006-08-21 | Henrik Grubbström (Grubba) | | |
026959 | 2006-09-20 | Martin Stjernholm | | *! Claims that the error object is an array, for compatibility with
*! old style error handling code.
|
738354 | 2006-08-21 | Henrik Grubbström (Grubba) | | */
static void f_error__is_type(INT32 args)
{
struct pike_string *array_string;
int ret;
MAKE_CONST_STRING(array_string, "array");
if (args < 0) SIMPLE_TOO_FEW_ARGS_ERROR("_is_type", 1);
if (args > 1) SIMPLE_WRONG_NUM_ARGS_ERROR("_is_type", 1);
if (Pike_sp[-args].type != PIKE_T_STRING)
SIMPLE_ARG_TYPE_ERROR("_is_type", 1, "string");
ret = Pike_sp[-args].u.string == array_string;
pop_n_elems(args);
push_int(ret);
}
|
026959 | 2006-09-20 | Martin Stjernholm | | |
4eb01f | 2002-08-15 | Marcus Comstedt | | */
static void f_error_create(INT32 args)
{
struct pike_string *msg;
|
1dc55b | 2004-12-17 | Martin Stjernholm | | struct array *bt = NULL;
get_all_args("create", args, "%W.%A", &msg, &bt);
|
e86c8c | 2003-11-14 | Martin Stjernholm | | do_free_string(GENERIC_ERROR_THIS->error_message);
copy_shared_string(GENERIC_ERROR_THIS->error_message, msg);
|
1dc55b | 2004-12-17 | Martin Stjernholm | |
if (bt) {
if (GENERIC_ERROR_THIS->error_backtrace)
free_array (GENERIC_ERROR_THIS->error_backtrace);
add_ref (GENERIC_ERROR_THIS->error_backtrace = bt);
}
else {
f_backtrace(0);
push_int (1);
o_range2 (RANGE_LOW_OPEN|RANGE_HIGH_FROM_END);
assign_to_short_svalue ((union anything *)&GENERIC_ERROR_THIS->error_backtrace,
PIKE_T_ARRAY, Pike_sp-1);
pop_stack();
}
pop_n_elems(args);
|
4eb01f | 2002-08-15 | Marcus Comstedt | | }
|
7c0df7 | 2001-02-06 | Henrik Grubbström (Grubba) | |
|
c59b92 | 2004-04-20 | Martin Nilsson | |
|
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)); \
|
a4a172 | 2000-12-05 | Per Hedbor | | 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 { \
|
cd8632 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | ERROR_STRUCT(STRUCT, o)->X.type = PIKE_T_INT; \
|
e86c8c | 2003-11-14 | Martin Stjernholm | | ERROR_STRUCT(STRUCT, o)->X.subtype = NUMBER_UNDEFINED; \
|
b4185e | 2000-04-04 | Henrik Grubbström (Grubba) | | 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 )
|
c4c6db | 2000-08-21 | Henrik Grubbström (Grubba) | | DECLSPEC(noreturn) void generic_error_va(struct object *o,
|
c29940 | 2001-11-10 | Martin Stjernholm | | const char *func,
|
c4c6db | 2000-08-21 | Henrik Grubbström (Grubba) | | struct svalue *base_sp, int args,
|
c29940 | 2001-11-10 | Martin Stjernholm | | const char *fmt,
|
c4c6db | 2000-08-21 | Henrik Grubbström (Grubba) | | va_list foo)
ATTRIBUTE((noreturn))
|
c85776 | 1999-03-16 | Fredrik Hübinette (Hubbe) | | {
|
564e33 | 2004-11-11 | Henrik Grubbström (Grubba) | | struct string_builder s;
|
81299f | 1999-03-19 | Fredrik Hübinette (Hubbe) | | int i;
|
c85776 | 1999-03-16 | Fredrik Hübinette (Hubbe) | |
|
2dbc88 | 2002-12-16 | Martin Stjernholm | | if(in_error)
{
const char *tmp=in_error;
in_error=0;
Pike_fatal("Recursive error() calls, original error: %s",tmp);
}
|
564e33 | 2004-11-11 | Henrik Grubbström (Grubba) | |
in_error = fmt;
init_string_builder(&s, 0);
string_builder_vsprintf(&s, fmt, foo);
|
c85776 | 1999-03-16 | Fredrik Hübinette (Hubbe) | |
|
483317 | 2003-07-22 | Martin Stjernholm | | #if 0
|
17fd85 | 2000-08-15 | Henrik Grubbström (Grubba) | | if (!master_program) {
|
564e33 | 2004-11-11 | Henrik Grubbström (Grubba) | | fprintf(stderr, "ERROR: %s\n", s.s->str);
|
15e5e9 | 2000-08-15 | Henrik Grubbström (Grubba) | | }
|
483317 | 2003-07-22 | Martin Stjernholm | | #endif
|
15e5e9 | 2000-08-15 | Henrik Grubbström (Grubba) | |
|
564e33 | 2004-11-11 | Henrik Grubbström (Grubba) | | ERROR_STRUCT(generic,o)->error_message = finish_string_builder(&s);
|
81299f | 1999-03-19 | Fredrik Hübinette (Hubbe) | | 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) | |
|
cd8632 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | if(Pike_sp[-1].type!=PIKE_T_ARRAY)
|
5aad93 | 2002-08-15 | Marcus Comstedt | | Pike_fatal("Error failed to generate a backtrace!\n");
|
81299f | 1999-03-19 | Fredrik Hübinette (Hubbe) | |
|
e86c8c | 2003-11-14 | Martin Stjernholm | | ERROR_STRUCT(generic,o)->error_backtrace=Pike_sp[-1].u.array;
|
fc26f6 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | Pike_sp--;
dmalloc_touch_svalue(Pike_sp);
|
81299f | 1999-03-19 | Fredrik Hübinette (Hubbe) | |
free_svalue(& throw_value);
|
cd8632 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | throw_value.type=PIKE_T_OBJECT;
|
f54c78 | 2004-12-22 | Henrik Grubbström (Grubba) | | throw_value.subtype = 0;
|
81299f | 1999-03-19 | Fredrik Hübinette (Hubbe) | | 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;
|
36fd7c | 2001-11-08 | Fredrik Hübinette (Hubbe) | |
dmalloc_touch_svalue(& throw_value);
|
c85776 | 1999-03-16 | Fredrik Hübinette (Hubbe) | | pike_throw();
}
|
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,
|
f38f28 | 2004-11-14 | Martin Stjernholm | | const char *desc, ...) ATTRIBUTE((noreturn))
|
78283b | 2001-08-16 | Martin Stjernholm | | {
va_list foo;
va_start(foo,desc);
ASSERT_THREAD_SWAPPED_IN();
DWERROR((stderr, "%s(): Throwing an error object\n", func));
ERROR_DONE(generic);
}
|
c4c6db | 2000-08-21 | Henrik Grubbström (Grubba) | | PMOD_EXPORT DECLSPEC(noreturn) void generic_error(
|
c29940 | 2001-11-10 | Martin Stjernholm | | const char *func,
|
81299f | 1999-03-19 | Fredrik Hübinette (Hubbe) | | struct svalue *base_sp, int args,
|
f38f28 | 2004-11-14 | Martin Stjernholm | | const char *desc, ...) ATTRIBUTE((noreturn))
|
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) | | }
|
c4c6db | 2000-08-21 | Henrik Grubbström (Grubba) | | PMOD_EXPORT DECLSPEC(noreturn) void index_error(
|
c29940 | 2001-11-10 | Martin Stjernholm | | const char *func,
|
81299f | 1999-03-19 | Fredrik Hübinette (Hubbe) | | struct svalue *base_sp, int args,
|
e86c8c | 2003-11-14 | Martin Stjernholm | | struct svalue *value,
struct svalue *index,
|
f38f28 | 2004-11-14 | Martin Stjernholm | | const char *desc, ...) ATTRIBUTE((noreturn))
|
81299f | 1999-03-19 | Fredrik Hübinette (Hubbe) | | {
INIT_ERROR(index);
|
e86c8c | 2003-11-14 | Martin Stjernholm | | ERROR_COPY_SVALUE(index, value);
ERROR_COPY_SVALUE(index, index);
|
81299f | 1999-03-19 | Fredrik Hübinette (Hubbe) | | ERROR_DONE(generic);
}
|
c85776 | 1999-03-16 | Fredrik Hübinette (Hubbe) | |
|
c4c6db | 2000-08-21 | Henrik Grubbström (Grubba) | | PMOD_EXPORT DECLSPEC(noreturn) void bad_arg_error(
|
c29940 | 2001-11-10 | Martin Stjernholm | | const char *func,
|
81299f | 1999-03-19 | Fredrik Hübinette (Hubbe) | | struct svalue *base_sp, int args,
|
e86c8c | 2003-11-14 | Martin Stjernholm | | int which_argument,
|
c29940 | 2001-11-10 | Martin Stjernholm | | const char *expected_type,
|
e86c8c | 2003-11-14 | Martin Stjernholm | | struct svalue *got_value,
|
f38f28 | 2004-11-14 | Martin Stjernholm | | const char *desc, ...) ATTRIBUTE((noreturn))
|
c85776 | 1999-03-16 | Fredrik Hübinette (Hubbe) | | {
|
df019f | 2004-04-18 | Martin Stjernholm | | INIT_ERROR(bad_argument);
ERROR_COPY(bad_argument, which_argument);
|
81aa52 | 2003-04-01 | Martin Stjernholm | | if (expected_type)
|
df019f | 2004-04-18 | Martin Stjernholm | | ERROR_STRUCT(bad_argument,o)->expected_type=make_shared_string(expected_type);
|
81aa52 | 2003-04-01 | Martin Stjernholm | | else
|
df019f | 2004-04-18 | Martin Stjernholm | | ERROR_STRUCT(bad_argument,o)->expected_type = NULL;
ERROR_COPY_SVALUE(bad_argument, got_value);
|
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) | |
|
c4c6db | 2000-08-21 | Henrik Grubbström (Grubba) | | PMOD_EXPORT DECLSPEC(noreturn) void math_error(
|
c29940 | 2001-11-10 | Martin Stjernholm | | const char *func,
|
d0ed26 | 1999-03-20 | Fredrik Hübinette (Hubbe) | | struct svalue *base_sp, int args,
|
28af0c | 1999-03-23 | Fredrik Hübinette (Hubbe) | | struct svalue *number,
|
f38f28 | 2004-11-14 | Martin Stjernholm | | const char *desc, ...) ATTRIBUTE((noreturn))
|
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{
|
cd8632 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | ERROR_STRUCT(math,o)->number.type=PIKE_T_INT;
|
c023d5 | 1999-03-23 | Fredrik Hübinette (Hubbe) | | 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);
}
|
c4c6db | 2000-08-21 | Henrik Grubbström (Grubba) | | PMOD_EXPORT DECLSPEC(noreturn) void resource_error(
|
c29940 | 2001-11-10 | Martin Stjernholm | | const char *func,
|
d0ed26 | 1999-03-20 | Fredrik Hübinette (Hubbe) | | struct svalue *base_sp, int args,
|
c29940 | 2001-11-10 | Martin Stjernholm | | const char *resource_type,
|
4f62cb | 2000-08-15 | Henrik Grubbström (Grubba) | | size_t howmuch_,
|
f38f28 | 2004-11-14 | Martin Stjernholm | | const char *desc, ...) ATTRIBUTE((noreturn))
|
d0ed26 | 1999-03-20 | Fredrik Hübinette (Hubbe) | | {
|
4f62cb | 2000-08-15 | Henrik Grubbström (Grubba) | | INT_TYPE howmuch = DO_NOT_WARN((INT_TYPE)howmuch_);
|
d0ed26 | 1999-03-20 | Fredrik Hübinette (Hubbe) | | INIT_ERROR(resource);
|
4f62cb | 2000-08-15 | Henrik Grubbström (Grubba) | | ERROR_COPY(resource, howmuch);
|
d0ed26 | 1999-03-20 | Fredrik Hübinette (Hubbe) | | ERROR_STRUCT(resource,o)->resource_type=make_shared_string(resource_type);
ERROR_DONE(generic);
}
|
c85776 | 1999-03-16 | Fredrik Hübinette (Hubbe) | |
|
c4c6db | 2000-08-21 | Henrik Grubbström (Grubba) | | PMOD_EXPORT DECLSPEC(noreturn) void permission_error(
|
c29940 | 2001-11-10 | Martin Stjernholm | | const char *func,
|
64dc4c | 1999-04-17 | Henrik Grubbström (Grubba) | | struct svalue *base_sp, int args,
|
c29940 | 2001-11-10 | Martin Stjernholm | | const char *permission_type,
|
f38f28 | 2004-11-14 | Martin Stjernholm | | const char *desc, ...) ATTRIBUTE((noreturn))
|
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);
}
|
c29940 | 2001-11-10 | Martin Stjernholm | | PMOD_EXPORT void wrong_number_of_args_error(const char *name, int args, int expected)
|
3a5b1d | 2000-05-24 | Fredrik Hübinette (Hubbe) | | {
if(expected>args)
{
|
81aa52 | 2003-04-01 | Martin Stjernholm | | bad_arg_error (name, Pike_sp-args, args, expected, NULL, NULL,
|
337298 | 2004-10-22 | Henrik Grubbström (Grubba) | | "Too few arguments to %s(). Expected at least %d (got %d).\n",
|
b9d3f3 | 2004-10-23 | Martin Nilsson | | name, expected, args);
|
4e30de | 2003-03-28 | Martin Stjernholm | | }else {
|
81aa52 | 2003-04-01 | Martin Stjernholm | | bad_arg_error (name, Pike_sp-args, args, expected, NULL, NULL,
|
337298 | 2004-10-22 | Henrik Grubbström (Grubba) | | "Too many arguments to %s(). Expected at most %d (got %d).\n",
name, expected, args);
|
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)
{
|
e1a35e | 2003-09-08 | Martin Stjernholm | | gc_mark_external_svalues(&throw_value,1," in the throw value");
|
20513c | 2000-04-12 | Fredrik Hübinette (Hubbe) | | }
#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
|