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
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)
{
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);
abort ();
/* 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;
}
......
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