Commit 7e462500 by Richard Kenner

(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
parent 241365d3
/* GNU Objective C Runtime Miscellaneous /* 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 Contrbuted by Kresten Krab Thorup
This file is part of GNU CC. This file is part of GNU CC.
...@@ -27,30 +27,53 @@ Boston, MA 02111-1307, USA. */ ...@@ -27,30 +27,53 @@ Boston, MA 02111-1307, USA. */
#define __USE_FIXED_PROTOTYPES__ #define __USE_FIXED_PROTOTYPES__
#include <stdlib.h> #include <stdlib.h>
#ifdef __alpha__
extern int write (int, const char*, int);
extern size_t strlen (const char*);
#endif
#include "runtime.h" #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 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); BOOL result = NO;
abort ();
/* 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 /* Set the error handler */
objc_fatal(const char* msg) objc_error_handler
objc_set_error_handler(objc_error_handler func)
{ {
write(2, msg, (int)strlen((const char*)msg)); objc_error_handler temp = _objc_error_handler;
abort(); _objc_error_handler = func;
return temp;
} }
/* /*
...@@ -65,7 +88,7 @@ objc_malloc(size_t size) ...@@ -65,7 +88,7 @@ objc_malloc(size_t size)
{ {
void* res = (void*) (*_objc_malloc)(size); void* res = (void*) (*_objc_malloc)(size);
if(!res) if(!res)
objc_fatal("Virtual memory exhausted\n"); objc_error(nil, OBJC_ERR_MEMORY, "Virtual memory exhausted\n");
return res; return res;
} }
...@@ -74,7 +97,7 @@ objc_atomic_malloc(size_t size) ...@@ -74,7 +97,7 @@ objc_atomic_malloc(size_t size)
{ {
void* res = (void*) (*_objc_atomic_malloc)(size); void* res = (void*) (*_objc_atomic_malloc)(size);
if(!res) if(!res)
objc_fatal("Virtual memory exhausted\n"); objc_error(nil, OBJC_ERR_MEMORY, "Virtual memory exhausted\n");
return res; return res;
} }
...@@ -83,7 +106,7 @@ objc_valloc(size_t size) ...@@ -83,7 +106,7 @@ objc_valloc(size_t size)
{ {
void* res = (void*) (*_objc_valloc)(size); void* res = (void*) (*_objc_valloc)(size);
if(!res) if(!res)
objc_fatal("Virtual memory exhausted\n"); objc_error(nil, OBJC_ERR_MEMORY, "Virtual memory exhausted\n");
return res; return res;
} }
...@@ -92,7 +115,7 @@ objc_realloc(void *mem, size_t size) ...@@ -92,7 +115,7 @@ objc_realloc(void *mem, size_t size)
{ {
void* res = (void*) (*_objc_realloc)(mem, size); void* res = (void*) (*_objc_realloc)(mem, size);
if(!res) if(!res)
objc_fatal("Virtual memory exhausted\n"); objc_error(nil, OBJC_ERR_MEMORY, "Virtual memory exhausted\n");
return res; return res;
} }
...@@ -101,7 +124,7 @@ objc_calloc(size_t nelem, size_t size) ...@@ -101,7 +124,7 @@ objc_calloc(size_t nelem, size_t size)
{ {
void* res = (void*) (*_objc_calloc)(nelem, size); void* res = (void*) (*_objc_calloc)(nelem, size);
if(!res) if(!res)
objc_fatal("Virtual memory exhausted\n"); objc_error(nil, OBJC_ERR_MEMORY, "Virtual memory exhausted\n");
return res; return res;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment