Commit 4665616f by Kresten Krab Thorup

(__objc_add_handler, __objc_remove_handler,

__objc_raise_error): New functions.
(__ex_last_handler): New variable

From-SVN: r4333
parent c8266dd2
...@@ -25,6 +25,7 @@ You should have received a copy of the GNU General Public License along with ...@@ -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. */ covered by the GNU General Public License. */
#include "runtime.h" #include "runtime.h"
#include "error.h"
void objc_error(id object, const char* fmt, va_list); void objc_error(id object, const char* fmt, va_list);
...@@ -70,3 +71,46 @@ __objc_xcalloc(size_t nelem, size_t size) ...@@ -70,3 +71,46 @@ __objc_xcalloc(size_t nelem, size_t size)
objc_fatal("Virtual memory exhausted\n"); objc_fatal("Virtual memory exhausted\n");
return res; 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();
}
}
}
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