covered by the GNU General Public License. */
#include "runtime.h"
+#include "error.h"
void objc_error(id object, const char* fmt, va_list);
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();
+ }
+ }
+}