(__objc_add_handler, __objc_remove_handler,
__objc_raise_error): New functions. (__ex_last_handler): New variable From-SVN: r4333
This commit is contained in:
parent
c8266dd238
commit
4665616f99
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user