716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
|
OBJC_ERROR("Cannot unlock spinlock!");
#endif
}
void
objc_exception_throw(id object)
{
struct objc_exception *e = malloc(sizeof(*e));
bool emergency = false;
if (e == NULL) {
#ifdef OF_HAVE_THREADS
if (!of_spinlock_lock(&emergency_exceptions_spinlock))
OBJC_ERROR("Cannot lock spinlock!");
#endif
|
|
|
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
|
OBJC_ERROR("Cannot unlock spinlock!");
#endif
}
void
objc_exception_throw(id object)
{
struct objc_exception *e = calloc(1, sizeof(*e));
bool emergency = false;
if (e == NULL) {
#ifdef OF_HAVE_THREADS
if (!of_spinlock_lock(&emergency_exceptions_spinlock))
OBJC_ERROR("Cannot lock spinlock!");
#endif
|
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
|
OBJC_ERROR("Cannot lock spinlock!");
#endif
}
if (e == NULL)
OBJC_ERROR("Not enough memory to allocate exception!")
memset(e, 0, sizeof(*e));
e->exception.class = GNUCOBJC_EXCEPTION_CLASS;
e->exception.cleanup = (emergency ? cleanup_emergency : cleanup);
e->object = object;
if (_Unwind_RaiseException(&e->exception) == _URC_END_OF_STACK &&
uncaught_exception_handler != NULL)
uncaught_exception_handler(object);
|
<
|
744
745
746
747
748
749
750
751
752
753
754
755
756
757
|
OBJC_ERROR("Cannot lock spinlock!");
#endif
}
if (e == NULL)
OBJC_ERROR("Not enough memory to allocate exception!")
e->exception.class = GNUCOBJC_EXCEPTION_CLASS;
e->exception.cleanup = (emergency ? cleanup_emergency : cleanup);
e->object = object;
if (_Unwind_RaiseException(&e->exception) == _URC_END_OF_STACK &&
uncaught_exception_handler != NULL)
uncaught_exception_handler(object);
|