From dceabbe3c1fca121e02f8dfe54b81fcd0b038a8e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20H=C3=BCbinette=20=28Hubbe=29?= <hubbe@hubbe.net> Date: Wed, 9 Oct 1996 04:01:32 +0200 Subject: [PATCH] exit_on_error fixed Rev: src/backend.c:1.4 Rev: src/builtin_functions.c:1.7 Rev: src/error.c:1.5 Rev: src/error.h:1.4 Rev: src/main.c:1.8 --- src/backend.c | 5 +++-- src/builtin_functions.c | 4 +++- src/error.c | 32 ++++++++++++++++++++------------ src/error.h | 3 ++- src/main.c | 4 +++- 5 files changed, 31 insertions(+), 17 deletions(-) diff --git a/src/backend.c b/src/backend.c index 391c8a3147..2498fd811a 100644 --- a/src/backend.c +++ b/src/backend.c @@ -184,11 +184,12 @@ void backend() if(SETJMP(back)) { - exit_on_error="Error in handle_error in master object!\nPrevious error:"; + ONERROR tmp; + SET_ONERROR(tmp,exit_on_error,"Error in handle_error in master object!"); assign_svalue_no_free(sp++, & throw_value); APPLY_MASTER("handle_error", 1); pop_stack(); - automatic_fatal=0; + UNSET_ONERROR(tmp); } while(first_object) diff --git a/src/builtin_functions.c b/src/builtin_functions.c index 65a0fd6352..16bffa63f0 100644 --- a/src/builtin_functions.c +++ b/src/builtin_functions.c @@ -617,6 +617,7 @@ struct callback *add_exit_callback(callback_func call, void f_exit(INT32 args) { + ONERROR tmp; int i; if(args < 1) error("Too few arguments to exit.\n"); @@ -624,7 +625,7 @@ void f_exit(INT32 args) if(sp[-args].type != T_INT) error("Bad argument 1 to exit.\n"); - exit_on_error="Pike is exiting: "; + SET_ONERROR(tmp,exit_on_error,"Error in handle_error in master object!"); call_callback(&exit_callbacks, (void *)0); free_callback(&exit_callbacks); @@ -634,6 +635,7 @@ void f_exit(INT32 args) exit_modules(); #endif + UNSET_ONERROR(tmp); exit(i); } diff --git a/src/error.c b/src/error.c index b4bd3c5cef..72493f2b30 100644 --- a/src/error.c +++ b/src/error.c @@ -15,7 +15,6 @@ #undef ATTRIBUTE #define ATTRIBUTE(X) -char *automatic_fatal, *exit_on_error; JMP_BUF *recoveries=0; JMP_BUF *init_recovery(JMP_BUF *r) @@ -80,22 +79,13 @@ void va_error(char *fmt, va_list args) ATTRIBUTE((noreturn)) VSPRINTF(buf, fmt, args); - if(automatic_fatal) - { - fprintf(stderr,"%s %s",automatic_fatal,buf); - abort(); - } - - if(exit_on_error || !recoveries) + if(!recoveries) { - if(!exit_on_error) - exit_on_error="No error recovery context: "; - #ifdef DEBUG dump_backlog(); #endif - fprintf(stderr,"%s %s",exit_on_error,buf); + fprintf(stderr,"No error recovery context!\n%s",buf); exit(99); } @@ -113,6 +103,24 @@ void va_error(char *fmt, va_list args) ATTRIBUTE((noreturn)) throw(); /* Hope someone is catching, or we will be out of balls. */ } +void exit_on_error(void *msg) +{ +#ifdef DEBUG + dump_backlog(); +#endif + fprintf(stderr,"%s\n",(char *)msg); + exit(1); +} + +void fatal_on_error(void *msg) +{ +#ifdef DEBUG + dump_backlog(); +#endif + fprintf(stderr,"%s\n",(char *)msg); + abort(); +} + void error(char *fmt,...) ATTRIBUTE((noreturn,format (printf, 1, 2))) { va_list args; diff --git a/src/error.h b/src/error.h index 900a783513..4f137b6e91 100644 --- a/src/error.h +++ b/src/error.h @@ -41,7 +41,6 @@ typedef struct JMP_BUF extern JMP_BUF *recoveries; extern struct svalue throw_value; -extern char *automatic_fatal, *exit_on_error; #define SETJMP(X) setjmp((init_recovery(&X)->recovery)) #define UNSETJMP(X) recoveries=X.previous; @@ -60,6 +59,8 @@ extern char *automatic_fatal, *exit_on_error; JMP_BUF *init_recovery(JMP_BUF *r); void throw() ATTRIBUTE((noreturn)); void va_error(char *fmt, va_list args) ATTRIBUTE((noreturn)); +void exit_on_error(void *msg); +void fatal_on_error(void *msg); void error(char *fmt,...) ATTRIBUTE((noreturn,format (printf, 1, 2))); void fatal(char *fmt, ...) ATTRIBUTE((noreturn,format (printf, 1, 2))); /* Prototypes end here */ diff --git a/src/main.c b/src/main.c index 16e86ff9fe..c9db3ad6ac 100644 --- a/src/main.c +++ b/src/main.c @@ -225,11 +225,13 @@ void main(int argc, char **argv, char **env) if(SETJMP(back)) { - exit_on_error="Error in handle_error, previous error (in _main): "; + ONERROR tmp; + SET_ONERROR(tmp,exit_on_error,"Error in handle_error in master object!"); assign_svalue_no_free(sp, & throw_value); sp++; APPLY_MASTER("handle_error", 1); pop_stack(); + UNSET_ONERROR(tmp); exit(10); } -- GitLab