diff options
Diffstat (limited to 'generic/tclPanic.c')
| -rw-r--r-- | generic/tclPanic.c | 86 |
1 files changed, 28 insertions, 58 deletions
diff --git a/generic/tclPanic.c b/generic/tclPanic.c index 1f5ef27..600307e 100644 --- a/generic/tclPanic.c +++ b/generic/tclPanic.c @@ -5,29 +5,29 @@ * applications will probably call Tcl_SetPanicProc() to set an * application-specific panic procedure. * - * Copyright © 1988-1993 The Regents of the University of California. - * Copyright © 1994 Sun Microsystems, Inc. - * Copyright © 1998-1999 Scriptics Corporation. + * Copyright (c) 1988-1993 The Regents of the University of California. + * Copyright (c) 1994 Sun Microsystems, Inc. + * Copyright (c) 1998-1999 by Scriptics Corporation. * * See the file "license.terms" for information on usage and redistribution of * this file, and for a DISCLAIMER OF ALL WARRANTIES. */ #include "tclInt.h" -#if defined(_WIN32) || defined(__CYGWIN__) - MODULE_SCOPE TCL_NORETURN void tclWinDebugPanic(const char *format, ...); -#endif /* * The panicProc variable contains a pointer to an application specific panic * procedure. */ -#if defined(__CYGWIN__) || (defined(_WIN32) && (defined(TCL_NO_DEPRECATED) || TCL_MAJOR_VERSION > 8)) -static TCL_NORETURN1 Tcl_PanicProc *panicProc = tclWinDebugPanic; -#else -static TCL_NORETURN1 Tcl_PanicProc *panicProc = NULL; -#endif +static Tcl_PanicProc *panicProc = NULL; + +/* + * The platformPanicProc variable contains a pointer to a platform specific + * panic procedure, if any. (TclpPanic may be NULL via a macro.) + */ + +static Tcl_PanicProc *CONST platformPanicProc = TclpPanic; /* *---------------------------------------------------------------------- @@ -45,21 +45,11 @@ static TCL_NORETURN1 Tcl_PanicProc *panicProc = NULL; *---------------------------------------------------------------------- */ -#undef Tcl_SetPanicProc -const char * +void Tcl_SetPanicProc( - TCL_NORETURN1 Tcl_PanicProc *proc) + Tcl_PanicProc *proc) { -#if defined(_WIN32) - /* tclWinDebugPanic only installs if there is no panicProc yet. */ - if (((Tcl_PanicProc *)proc != tclWinDebugPanic) || (panicProc == NULL)) -#elif defined(__CYGWIN__) - if (proc == NULL) - panicProc = tclWinDebugPanic; - else -#endif panicProc = proc; - return Tcl_InitSubsystems(); } /* @@ -80,13 +70,13 @@ Tcl_SetPanicProc( void Tcl_PanicVA( - const char *format, /* Format string, suitable for passing to + CONST char *format, /* Format string, suitable for passing to * fprintf. */ va_list argList) /* Variable argument list. */ { - char *arg1, *arg2, *arg3; /* Additional arguments (variable in number) - * to pass to fprintf. */ - char *arg4, *arg5, *arg6, *arg7, *arg8; + char *arg1, *arg2, *arg3, *arg4; /* Additional arguments (variable in + * number) to pass to fprintf. */ + char *arg5, *arg6, *arg7, *arg8; arg1 = va_arg(argList, char *); arg2 = va_arg(argList, char *); @@ -98,32 +88,17 @@ Tcl_PanicVA( arg8 = va_arg(argList, char *); if (panicProc != NULL) { - panicProc(format, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8); -#ifdef _WIN32 - } else if (IsDebuggerPresent()) { - tclWinDebugPanic(format, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8); -#endif + (void) (*panicProc)(format, arg1, arg2, arg3, arg4, + arg5, arg6, arg7, arg8); + } else if (platformPanicProc != NULL) { + (void) (*platformPanicProc)(format, arg1, arg2, arg3, arg4, + arg5, arg6, arg7, arg8); } else { - fprintf(stderr, format, arg1, arg2, arg3, arg4, arg5, arg6, arg7, - arg8); - fprintf(stderr, "\n"); - fflush(stderr); -#if defined(_WIN32) || defined(__CYGWIN__) -# if defined(__GNUC__) - __builtin_trap(); -# elif defined(_WIN64) - __debugbreak(); -# elif defined(_MSC_VER) && defined (_M_IX86) - _asm {int 3} -# else - DebugBreak(); -# endif -#endif -#if defined(_WIN32) - ExitProcess(1); -#else + (void) fprintf(stderr, format, arg1, arg2, arg3, arg4, arg5, arg6, + arg7, arg8); + (void) fprintf(stderr, "\n"); + (void) fflush(stderr); abort(); -#endif } } @@ -143,15 +118,10 @@ Tcl_PanicVA( *---------------------------------------------------------------------- */ -/* - * The following comment is here so that Coverity's static analyzer knows that - * a Tcl_Panic() call can never return and avoids lots of false positives. - */ - -/* coverity[+kill] */ + /* ARGSUSED */ void Tcl_Panic( - const char *format, + CONST char *format, ...) { va_list argList; |
