(objc_verror): New function.
authorRichard Kenner <kenner@gcc.gnu.org>
Mon, 3 Feb 1997 00:41:03 +0000 (19:41 -0500)
committerRichard Kenner <kenner@gcc.gnu.org>
Mon, 3 Feb 1997 00:41:03 +0000 (19:41 -0500)
(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

index 371025d2b556208781af2a62b6c34aef8c08798e..8fc8a3fa6c8c6429b2e3e974cc87a05e57da48fe 100644 (file)
@@ -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;
 }