diff options
author | Richard Kenner <kenner@gcc.gnu.org> | 1997-02-02 19:41:03 -0500 |
---|---|---|
committer | Richard Kenner <kenner@gcc.gnu.org> | 1997-02-02 19:41:03 -0500 |
commit | 7e46250027e3654b430af0db8ffc0f6c822a2c7f (patch) | |
tree | cd783b7a928f3129734756e2a1456dd7a9c6a20c /gcc/objc/misc.c | |
parent | 241365d3cca8fbfa14551346155b669450ad70d3 (diff) | |
download | gcc-7e46250027e3654b430af0db8ffc0f6c822a2c7f.zip gcc-7e46250027e3654b430af0db8ffc0f6c822a2c7f.tar.gz gcc-7e46250027e3654b430af0db8ffc0f6c822a2c7f.tar.bz2 |
(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
Diffstat (limited to 'gcc/objc/misc.c')
-rw-r--r-- | gcc/objc/misc.c | 65 |
1 files changed, 44 insertions, 21 deletions
diff --git a/gcc/objc/misc.c b/gcc/objc/misc.c index 371025d..8fc8a3f 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 <stdlib.h> - -#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; } |