Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • libcfa/src/exception.c

    r979df46 r8ad5752  
    1010// Created On       : Mon Jun 26 15:13:00 2017
    1111// Last Modified By : Andrew Beach
    12 // Last Modified On : Tue Apr 14 12:01:00 2020
    13 // Update Count     : 18
     12// Last Modified On : Thr May 21 12:18:00 2020
     13// Update Count     : 20
    1414//
    1515
     
    8080}
    8181
    82 void __cfaehm_throw_resume(exception_t * except) {
     82void __cfaehm_throw_resume(exception_t * except, void (*defaultHandler)(exception_t *)) {
    8383        struct exception_context_t * context = this_exception_context();
    8484
     
    9696        }
    9797
     98        // No handler found, fall back to the default operation.
    9899        __cfadbg_print_safe(exception, "Unhandled exception\n");
    99 
    100         // Fall back to termination:
    101         __cfaehm_throw_terminate(except);
    102         // TODO: Default handler for resumption.
     100        defaultHandler(except);
    103101}
    104102
     
    239237}
    240238
     239static void __cfaehm_cleanup_default( exception_t ** except ) {
     240        __cfaehm_delete_exception( *except );
     241        *except = NULL;
     242}
     243
    241244// The exception that is being thrown must already be stored.
    242 static __attribute__((noreturn)) void __cfaehm_begin_unwind(void) {
    243         if ( ! this_exception_context()->current_exception ) {
     245static void __cfaehm_begin_unwind(void(*defaultHandler)(exception_t *)) {
     246        struct exception_context_t * context = this_exception_context();
     247        struct _Unwind_Exception * storage = &this_exception_storage;
     248        if ( NULL == context->current_exception ) {
    244249                printf("UNWIND ERROR missing exception in begin unwind\n");
    245250                abort();
     
    247252
    248253        // Call stdlibc to raise the exception
    249         _Unwind_Reason_Code ret = _Unwind_RaiseException( &this_exception_storage );
     254        __cfadbg_print_safe(exception, "Begin unwinding (storage &p, context %p)\n", storage, context);
     255        _Unwind_Reason_Code ret = _Unwind_RaiseException( storage );
    250256
    251257        // If we reach here it means something happened. For resumption to work we need to find a way
     
    256262        // the whole stack.
    257263
     264        // We did not simply reach the end of the stack without finding a handler. This is an error.
     265        if ( ret != _URC_END_OF_STACK ) {
     266                printf("UNWIND ERROR %d after raise exception\n", ret);
     267                abort();
     268        }
     269
    258270        // No handler found, go to the default operation.
    259         // Currently this will always be a cancellation.
    260         if ( ret == _URC_END_OF_STACK ) {
    261                 __cfadbg_print_safe(exception, "Uncaught exception %p\n", &this_exception_storage);
    262 
    263                 __cfaehm_cancel_stack(this_exception_context()->current_exception);
    264         }
    265 
    266         // We did not simply reach the end of the stack without finding a handler. This is an error.
    267         printf("UNWIND ERROR %d after raise exception\n", ret);
     271        __cfadbg_print_safe(exception, "Uncaught exception %p\n", storage);
     272
     273        __attribute__((cleanup(__cfaehm_cleanup_default)))
     274        exception_t * exception = context->current_exception;
     275        defaultHandler( exception );
     276}
     277
     278void __cfaehm_throw_terminate( exception_t * val, void (*defaultHandler)(exception_t *) ) {
     279        __cfadbg_print_safe(exception, "Throwing termination exception\n");
     280
     281        __cfaehm_allocate_exception( val );
     282        __cfaehm_begin_unwind( defaultHandler );
     283}
     284
     285static __attribute__((noreturn)) void __cfaehm_rethrow_adapter( exception_t * except ) {
     286        // TODO: Print some error message.
     287        (void)except;
    268288        abort();
    269 }
    270 
    271 void __cfaehm_throw_terminate( exception_t * val ) {
    272         __cfadbg_print_safe(exception, "Throwing termination exception\n");
    273 
    274         __cfaehm_allocate_exception( val );
    275         __cfaehm_begin_unwind();
    276289}
    277290
     
    279292        __cfadbg_print_safe(exception, "Rethrowing termination exception\n");
    280293
    281         __cfaehm_begin_unwind();
     294        __cfaehm_begin_unwind( __cfaehm_rethrow_adapter );
     295        abort();
    282296}
    283297
Note: See TracChangeset for help on using the changeset viewer.