diff --git a/src/error.c b/src/error.c index 7dd6b074de979d642da26596912e79e25cfffeee..7ab6e69ab0adea77130e6dd05ab289e039342b9a 100644 --- a/src/error.c +++ b/src/error.c @@ -2,7 +2,7 @@ || This file is part of Pike. For copyright information see COPYRIGHT. || Pike is distributed under GPL, LGPL and MPL. See the file COPYING || for more information. -|| $Id: error.c,v 1.157 2008/05/27 15:59:17 mast Exp $ +|| $Id: error.c,v 1.158 2008/05/27 17:35:34 grubba Exp $ */ #define NO_PIKE_SHORTHAND @@ -14,6 +14,7 @@ #include "stralloc.h" #include "builtin_functions.h" #include "array.h" +#include "mapping.h" #include "object.h" #include "main.h" #include "builtin_functions.h" @@ -28,6 +29,8 @@ #undef ATTRIBUTE #define ATTRIBUTE(X) +/* #define ERROR_DEBUG */ + PMOD_EXPORT const char msg_fatal_error[] = "%s:%d: Fatal error:\n"; #ifdef PIKE_DEBUG @@ -61,6 +64,8 @@ PMOD_EXPORT const char msg_div_by_zero[] = */ #ifdef PIKE_DEBUG +/* struct mapping *recovery_lookup = NULL; */ + PMOD_EXPORT void check_recovery_context(void) { char foo; @@ -68,11 +73,18 @@ PMOD_EXPORT void check_recovery_context(void) if(Pike_interpreter.recoveries && Pike_interpreter.recoveries->on_stack && TESTILITEST > 0) { + struct svalue *s; fprintf(stderr, "Recoveries is out biking (Pike_interpreter.recoveries=%p, Pike_sp=%p, %ld)!\n", Pike_interpreter.recoveries, &foo, DO_NOT_WARN((long)TESTILITEST)); - fprintf(stderr, "Last recovery was added at %s\n", - Pike_interpreter.recoveries->file); + fprintf(stderr, "Last recovery was added at %s:\n", + Pike_interpreter.recoveries->file, + Pike_interpreter.recoveries->line); + push_int((ptrdiff_t)Pike_interpreter.recoveries); +/* if ((s = low_mapping_lookup(recovery_lookup, Pike_sp-1))) { */ +/* fprintf(stderr, "Try also looking at %s.\n", (char*)s->u.integer); */ +/* } */ + pop_stack(); Pike_fatal("Recoveries is out biking (Pike_interpreter.recoveries=%p, C sp=%p, %ld)!\n", Pike_interpreter.recoveries, &foo, DO_NOT_WARN((long)TESTILITEST)); @@ -103,6 +115,14 @@ PMOD_EXPORT JMP_BUF *init_recovery(JMP_BUF *r, size_t stack_pop_levels DEBUG_INI r->severity=THROW_ERROR; Pike_interpreter.recoveries=r; check_recovery_context(); +#ifdef PIKE_DEBUG +/* if (recovery_lookup && Pike_sp) { */ +/* push_int((ptrdiff_t)r); */ +/* push_int((ptrdiff_t)location); */ +/* mapping_insert(recovery_lookup, Pike_sp-2, Pike_sp-1); */ +/* pop_n_elems(2); */ +/* } */ +#endif return r; } @@ -914,7 +934,7 @@ static void f_error_create(INT32 args) #define ERROR_DONE(FOO) \ PIKE_CONCAT(FOO,_error_va(o,func, \ base_sp, args, \ - desc,&foo)); \ + desc,foo)); \ va_end(foo) #define ERROR_STRUCT(STRUCT,O) \ @@ -950,7 +970,7 @@ static void f_error_create(INT32 args) */ PMOD_EXPORT DECLSPEC(noreturn) void generic_error_va( struct object *o, const char *func, const struct svalue *base_sp, int args, - const char *fmt, va_list *fmt_args) + const char *fmt, va_list fmt_args) { struct generic_error_struct *err = (struct generic_error_struct *) get_storage (o, generic_error_program); @@ -971,7 +991,7 @@ PMOD_EXPORT DECLSPEC(noreturn) void generic_error_va( if (fmt) { struct string_builder s; init_string_builder(&s, 0); - string_builder_vsprintf(&s, fmt, *fmt_args); + string_builder_vsprintf(&s, fmt, fmt_args); #if 0 if (!master_program) { @@ -1071,7 +1091,7 @@ PMOD_EXPORT DECLSPEC(noreturn) void bad_arg_error( ERROR_STRUCT(bad_argument,o)->expected_type = NULL; ERROR_COPY_SVALUE(bad_argument, got_value); DWERROR((stderr, "%s():Bad arg %d (expected %s)\n", - func, which_arg, expected_type)); + func, which_argument, expected_type)); ERROR_DONE(generic); } @@ -1147,11 +1167,16 @@ void init_error(void) #ifdef PIKE_DEBUG dmalloc_accept_leak(add_gc_callback(gc_check_throw_value,0,0)); + +/* recovery_lookup = allocate_mapping(100); */ #endif } void cleanup_error(void) { +#ifdef PIKE_DEBUG +/* free_mapping(recovery_lookup); */ +#endif #define ERR_CLEANUP #include "errors.h" } diff --git a/src/pike_error.h b/src/pike_error.h index c1590c977b4294ee2d5d01aea7bbd79bda17e6ca..c5bef58f6601b954c868fe4c3ffd87a911f09a7e 100644 --- a/src/pike_error.h +++ b/src/pike_error.h @@ -2,7 +2,7 @@ || This file is part of Pike. For copyright information see COPYRIGHT. || Pike is distributed under GPL, LGPL and MPL. See the file COPYING || for more information. -|| $Id: pike_error.h,v 1.45 2008/05/27 15:59:17 mast Exp $ +|| $Id: pike_error.h,v 1.46 2008/05/27 17:35:34 grubba Exp $ */ #ifndef PIKE_ERROR_H @@ -109,7 +109,7 @@ typedef struct ONERROR typedef struct JMP_BUF { struct JMP_BUF *previous; - LOW_JMP_BUF recovery; + volatile LOW_JMP_BUF recovery; struct pike_frame *frame_pointer; ptrdiff_t stack_pointer; ptrdiff_t mark_sp; @@ -128,18 +128,19 @@ extern int throw_severity; #ifdef PIKE_DEBUG PMOD_EXPORT extern const char msg_unsetjmp_nosync_1[]; PMOD_EXPORT extern const char msg_unsetjmp_nosync_2[]; -#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) \ - Pike_fatal(msg_unsetjmp_nosync_1,Pike_interpreter.recoveries->file); \ - else \ - Pike_fatal(msg_unsetjmp_nosync_2); \ - } \ - Pike_interpreter.recoveries=X.previous; \ - check_recovery_context(); \ +#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) \ + Pike_fatal(msg_unsetjmp_nosync_1, \ + Pike_interpreter.recoveries->file); \ + else \ + Pike_fatal(msg_unsetjmp_nosync_2); \ + } \ + Pike_interpreter.recoveries=X.previous; \ + check_recovery_context(); \ }while (0) #ifdef DMALLOC_LOCATION @@ -162,41 +163,42 @@ PMOD_EXPORT extern const char msg_unsetjmp_nosync_2[]; #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.frame_pointer = Pike_interpreter.frame_pointer; \ - 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; \ +#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.frame_pointer = Pike_interpreter.frame_pointer; \ + 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) 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[]; -#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)) { \ - fprintf(stderr,msg_last_setjmp,Pike_interpreter.recoveries->file); \ - if (Pike_interpreter.recoveries->onerror) { \ - Pike_fatal(msg_unset_onerr_nosync_1,\ - Pike_interpreter.recoveries->onerror, &(X), \ +#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)) { \ + fprintf(stderr,msg_last_setjmp, \ + Pike_interpreter.recoveries->file); \ + if (Pike_interpreter.recoveries->onerror) { \ + Pike_fatal(msg_unset_onerr_nosync_1, \ + Pike_interpreter.recoveries->onerror, &(X), \ Pike_interpreter.recoveries->onerror->file); \ - } else { \ - Pike_fatal(msg_unset_onerr_nosync_2); \ - } \ - } \ - Pike_interpreter.recoveries->onerror=(X).previous; \ + } else { \ + Pike_fatal(msg_unset_onerr_nosync_2); \ + } \ + } \ + Pike_interpreter.recoveries->onerror=(X).previous; \ } while(0) PMOD_EXPORT extern const char msg_assert_onerr[]; @@ -255,7 +257,7 @@ PMOD_EXPORT DECLSPEC(noreturn) void Pike_error(const char *fmt,...) ATTRIBUTE((n PMOD_EXPORT DECLSPEC(noreturn) void debug_fatal(const char *fmt, ...) ATTRIBUTE((noreturn)); PMOD_EXPORT DECLSPEC(noreturn) void generic_error_va( struct object *o, const char *func, const struct svalue *base_sp, int args, - const char *fmt, va_list *fmt_args) + const char *fmt, va_list fmt_args) ATTRIBUTE((noreturn)); PMOD_EXPORT DECLSPEC(noreturn) void throw_error_object( struct object *o, @@ -331,6 +333,7 @@ PMOD_EXPORT extern const char msg_bad_arg_2[]; PMOD_EXPORT extern const char msg_out_of_mem[]; PMOD_EXPORT extern const char msg_out_of_mem_2[]; +#if 1 static INLINE void DECLSPEC(noreturn) out_of_memory_error ( const char *func, struct svalue *base_sp, int args, @@ -343,6 +346,15 @@ static INLINE void DECLSPEC(noreturn) out_of_memory_error ( resource_error (func, base_sp, args, "memory", amount, amount ? msg_out_of_mem_2 : msg_out_of_mem, amount); } +#else +#define out_of_memory_error(FUNC, BASE_SP, ARGS, AMOUNT) \ + do { \ + size_t amount_ = (AMOUNT); \ + int args_ = (ARGS); \ + resource_error((FUNC), (BASE_SP), args_, "memory", amount_, \ + msg_out_of_mem_2, amount_); \ + } while(0) +#endif #define SIMPLE_OUT_OF_MEMORY_ERROR(FUNC, AMOUNT) \ out_of_memory_error(FUNC, Pike_sp-args, args, AMOUNT)