From 7e46250027e3654b430af0db8ffc0f6c822a2c7f Mon Sep 17 00:00:00 2001 From: Richard Kenner Date: Sun, 2 Feb 1997 19:41:03 -0500 Subject: [PATCH] (objc_verror): New function. (objc_fatal): Remove function. (objc_set_error_handler): New function. (_objc_error_handler): New global variable. (__alpha__): Remove unneeded code. (objc_error): Allow user specified error handler function to trap and handle the objc error. Added an error code parameter which indicates the specific error that occured. (objc_malloc, objc_atomic_malloc): Replace call to objc_fatal function with call to objc_error function. (objc_valloc, objc_realloc, objc_calloc): Likewise. From-SVN: r13589 --- gcc/objc/misc.c | 65 +++++++++++++++++++++++++++++++++---------------- 1 file changed, 44 insertions(+), 21 deletions(-) diff --git a/gcc/objc/misc.c b/gcc/objc/misc.c index 371025d2b55..8fc8a3fa6c8 100644 --- a/gcc/objc/misc.c +++ b/gcc/objc/misc.c @@ -1,5 +1,5 @@ /* GNU Objective C Runtime Miscellaneous - Copyright (C) 1993, 1994, 1995, 1996 Free Software Foundation, Inc. + Copyright (C) 1993, 1994, 1995, 1996, 1997 Free Software Foundation, Inc. Contrbuted by Kresten Krab Thorup This file is part of GNU CC. @@ -27,30 +27,53 @@ Boston, MA 02111-1307, USA. */ #define __USE_FIXED_PROTOTYPES__ #include - -#ifdef __alpha__ -extern int write (int, const char*, int); -extern size_t strlen (const char*); -#endif - #include "runtime.h" -void objc_error(id object, const char* fmt, va_list); +/* +** Error handler function +** NULL so that default is to just print to stderr +*/ +static objc_error_handler _objc_error_handler = NULL; + +/* Trigger an objc error */ +void +objc_error(id object, int code, const char* fmt, ...) +{ + va_list ap; -void (*_objc_error)(id, const char*, va_list) = objc_error; + va_start(ap, fmt); + objc_verror(object, code, fmt, ap); + va_end(ap); +} +/* Trigger an objc error */ void -objc_error(id object, const char* fmt, va_list ap) +objc_verror(id object, int code, const char* fmt, va_list ap) { - vfprintf (stderr, fmt, ap); - abort (); + BOOL result = NO; + + /* Call the error handler if its there + Otherwise print to stderr */ + if (_objc_error_handler) + result = (*_objc_error_handler)(object, code, fmt, ap); + else + vfprintf (stderr, fmt, ap); + + /* Continue if the error handler says its ok + Otherwise abort the program */ + if (result) + return; + else + abort(); } -volatile void -objc_fatal(const char* msg) +/* Set the error handler */ +objc_error_handler +objc_set_error_handler(objc_error_handler func) { - write(2, msg, (int)strlen((const char*)msg)); - abort(); + objc_error_handler temp = _objc_error_handler; + _objc_error_handler = func; + return temp; } /* @@ -65,7 +88,7 @@ objc_malloc(size_t size) { void* res = (void*) (*_objc_malloc)(size); if(!res) - objc_fatal("Virtual memory exhausted\n"); + objc_error(nil, OBJC_ERR_MEMORY, "Virtual memory exhausted\n"); return res; } @@ -74,7 +97,7 @@ objc_atomic_malloc(size_t size) { void* res = (void*) (*_objc_atomic_malloc)(size); if(!res) - objc_fatal("Virtual memory exhausted\n"); + objc_error(nil, OBJC_ERR_MEMORY, "Virtual memory exhausted\n"); return res; } @@ -83,7 +106,7 @@ objc_valloc(size_t size) { void* res = (void*) (*_objc_valloc)(size); if(!res) - objc_fatal("Virtual memory exhausted\n"); + objc_error(nil, OBJC_ERR_MEMORY, "Virtual memory exhausted\n"); return res; } @@ -92,7 +115,7 @@ objc_realloc(void *mem, size_t size) { void* res = (void*) (*_objc_realloc)(mem, size); if(!res) - objc_fatal("Virtual memory exhausted\n"); + objc_error(nil, OBJC_ERR_MEMORY, "Virtual memory exhausted\n"); return res; } @@ -101,7 +124,7 @@ objc_calloc(size_t nelem, size_t size) { void* res = (void*) (*_objc_calloc)(nelem, size); if(!res) - objc_fatal("Virtual memory exhausted\n"); + objc_error(nil, OBJC_ERR_MEMORY, "Virtual memory exhausted\n"); return res; } -- 2.30.2