diff options
author | Kresten Krab Thorup <krab@gcc.gnu.org> | 1993-05-05 13:52:15 +0000 |
---|---|---|
committer | Kresten Krab Thorup <krab@gcc.gnu.org> | 1993-05-05 13:52:15 +0000 |
commit | 4665616f99c52891f661a46caba5d72b34acf58c (patch) | |
tree | dba7fb88f9ea583d47b30db4b1769c0d11c533f5 /gcc/objc/misc.c | |
parent | c8266dd238bf96738d2b2cb05b1d271492d61a6b (diff) | |
download | gcc-4665616f99c52891f661a46caba5d72b34acf58c.zip gcc-4665616f99c52891f661a46caba5d72b34acf58c.tar.gz gcc-4665616f99c52891f661a46caba5d72b34acf58c.tar.bz2 |
(__objc_add_handler, __objc_remove_handler,
__objc_raise_error): New functions.
(__ex_last_handler): New variable
From-SVN: r4333
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 6b6b342..ec42c2c 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(); + } + } +} |