diff options
author | krab <krab@138bc75d-0d04-0410-961f-82ee72b054a4> | 1993-05-05 13:52:15 +0000 |
---|---|---|
committer | krab <krab@138bc75d-0d04-0410-961f-82ee72b054a4> | 1993-05-05 13:52:15 +0000 |
commit | 45f1bf7dda537cc74eb088404088e6c1ce558136 (patch) | |
tree | dba7fb88f9ea583d47b30db4b1769c0d11c533f5 /gcc/objc/misc.c | |
parent | 22787f76c1382330630f67768c66d5f5d868ad79 (diff) | |
download | ppe42-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.c | 44 |
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(); + } + } +} |