diff options
Diffstat (limited to 'contrib/gcc/objc/misc.c')
-rw-r--r-- | contrib/gcc/objc/misc.c | 130 |
1 files changed, 101 insertions, 29 deletions
diff --git a/contrib/gcc/objc/misc.c b/contrib/gcc/objc/misc.c index 033018e..01f9d3b 100644 --- a/contrib/gcc/objc/misc.c +++ b/contrib/gcc/objc/misc.c @@ -1,7 +1,6 @@ /* GNU Objective C Runtime Miscellaneous - Copyright (C) 1993, 1994, 1995 Free Software Foundation, Inc. - -Author: Kresten Krab Thorup + Copyright (C) 1993, 1994, 1995, 1996, 1997 Free Software Foundation, Inc. + Contributed by Kresten Krab Thorup This file is part of GNU CC. @@ -26,55 +25,128 @@ Boston, MA 02111-1307, USA. */ however invalidate any other reasons why the executable file might be covered by the GNU General Public License. */ -#ifdef __alpha__ +#define __USE_FIXED_PROTOTYPES__ #include <stdlib.h> -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) +{ + 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(); +} + +/* Set the error handler */ +objc_error_handler +objc_set_error_handler(objc_error_handler func) +{ + objc_error_handler temp = _objc_error_handler; + _objc_error_handler = func; + return temp; +} + +/* +** Standard functions for memory allocation and disposal. +** Users should use these functions in their ObjC programs so +** that they work properly with garbage collectors as well as +** can take advantage of the exception/error handling available. +*/ + +void * +objc_malloc(size_t size) { - vfprintf (stderr, fmt, ap); - abort (); + void* res = (void*) (*_objc_malloc)(size); + if(!res) + objc_error(nil, OBJC_ERR_MEMORY, "Virtual memory exhausted\n"); + return res; } -volatile void -objc_fatal(const char* msg) +void * +objc_atomic_malloc(size_t size) { - write(2, msg, (int)strlen((const char*)msg)); - abort(); + void* res = (void*) (*_objc_atomic_malloc)(size); + if(!res) + objc_error(nil, OBJC_ERR_MEMORY, "Virtual memory exhausted\n"); + return res; } -void* -__objc_xmalloc(size_t size) +void * +objc_valloc(size_t size) { - void* res = (void*) malloc(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; } -void* -__objc_xrealloc(void* mem, size_t size) +void * +objc_realloc(void *mem, size_t size) { - void* res = (void*) realloc(mem, 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; } -void* -__objc_xcalloc(size_t nelem, size_t size) +void * +objc_calloc(size_t nelem, size_t size) { - void* res = (void*)calloc(nelem, 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; } + +void +objc_free(void *mem) +{ + (*_objc_free)(mem); +} + +/* +** Hook functions for memory allocation and disposal. +** This makes it easy to substitute garbage collection systems +** such as Boehm's GC by assigning these function pointers +** to the GC's allocation routines. By default these point +** to the ANSI standard malloc, realloc, free, etc. +** +** Users should call the normal objc routines above for +** memory allocation and disposal within their programs. +*/ +void *(*_objc_malloc)(size_t) = malloc; +void *(*_objc_atomic_malloc)(size_t) = malloc; +void *(*_objc_valloc)(size_t) = malloc; +void *(*_objc_realloc)(void *, size_t) = realloc; +void *(*_objc_calloc)(size_t, size_t) = calloc; +void (*_objc_free)(void *) = free; |