summaryrefslogtreecommitdiffstats
path: root/gcc/objc/misc.c
diff options
context:
space:
mode:
authorkrab <krab@138bc75d-0d04-0410-961f-82ee72b054a4>1993-05-05 13:52:15 +0000
committerkrab <krab@138bc75d-0d04-0410-961f-82ee72b054a4>1993-05-05 13:52:15 +0000
commit45f1bf7dda537cc74eb088404088e6c1ce558136 (patch)
treedba7fb88f9ea583d47b30db4b1769c0d11c533f5 /gcc/objc/misc.c
parent22787f76c1382330630f67768c66d5f5d868ad79 (diff)
downloadppe42-gcc-45f1bf7dda537cc74eb088404088e6c1ce558136.tar.gz
ppe42-gcc-45f1bf7dda537cc74eb088404088e6c1ce558136.zip
(__objc_add_handler, __objc_remove_handler,
__objc_raise_error): New functions. (__ex_last_handler): New variable git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@4333 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/objc/misc.c')
-rw-r--r--gcc/objc/misc.c44
1 files changed, 44 insertions, 0 deletions
diff --git a/gcc/objc/misc.c b/gcc/objc/misc.c
index 6b6b3429822..ec42c2cfe19 100644
--- a/gcc/objc/misc.c
+++ b/gcc/objc/misc.c
@@ -25,6 +25,7 @@ You should have received a copy of the GNU General Public License along with
covered by the GNU General Public License. */
#include "runtime.h"
+#include "error.h"
void objc_error(id object, const char* fmt, va_list);
@@ -70,3 +71,46 @@ __objc_xcalloc(size_t nelem, size_t size)
objc_fatal("Virtual memory exhausted\n");
return res;
}
+
+struct objc_ex_handler __ex_base_handler = {0, 0, 0, 0, 0 };
+struct objc_ex_handler* __ex_last_handler = &__ex_base_handler;
+
+objc_uncaught_exception_handler _objc_uncaught_exception_handler = 0;
+
+void
+__objc_add_handler(struct objc_ex_handler* hdlr)
+{
+ hdlr->ex_prev = __ex_last_handler;
+ __ex_last_handler = hdlr;
+}
+
+void
+__objc_remove_handler(struct objc_ex_handler* hdlr)
+{
+ __ex_last_handler = hdlr->ex_prev;
+}
+
+#ifndef __STRICT_ANSI__
+__volatile
+#endif
+extern void __objc_raise_error(int code, const void* data1, const void* data2)
+{
+ if (__ex_last_handler->ex_prev)
+ {
+ __ex_last_handler->code = code;
+ __ex_last_handler->data1 = data1;
+ __ex_last_handler->data2 = data2;
+ longjmp (__ex_last_handler->ex_env, 1);
+ }
+ else
+ {
+ if (_objc_uncaught_exception_handler)
+ (*_objc_uncaught_exception_handler)(code, data1, data2);
+ else
+ {
+ printf ("uncaught exception: code=%d, data1=%x, data2=%x\n",
+ code, data1, data2);
+ abort();
+ }
+ }
+}
OpenPOWER on IntegriCloud