Changes in / [730f4f1:7c6b262]


Ignore:
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • libcfa/src/exception.c

    r730f4f1 r7c6b262  
    121121
    122122
    123 // MEMORY MANAGEMENT =========================================================
     123// TERMINATION ===============================================================
     124
     125// MEMORY MANAGEMENT (still for integers)
     126// May have to move to cfa for constructors and destructors (references).
    124127
    125128// How to clean up an exception in various situations.
     
    200203}
    201204
    202 // CANCELLATION ==============================================================
     205// If this isn't a rethrow (*except==0), delete the provided exception.
     206void __cfaehm_cleanup_terminate( void * except ) {
     207        if ( *(void**)except ) __cfaehm_delete_exception( *(exception_t **)except );
     208}
    203209
    204210// Function needed by force unwind
     
    222228}
    223229
    224 // Cancel the current stack, prefroming approprate clean-up and messaging.
    225 static __attribute__((noreturn)) void __cfaehm_cancel_stack(
    226                 exception_t * exception ) {
    227         // TODO: Detect current stack and pick a particular stop-function.
    228         _Unwind_Reason_Code ret;
    229         ret = _Unwind_ForcedUnwind( &this_exception_storage, _Stop_Fn, (void*)0x22 );
    230         printf("UNWIND ERROR %d after force unwind\n", ret);
    231         abort();
    232 }
    233 
    234 
    235 // TERMINATION ===============================================================
    236 
    237 // If this isn't a rethrow (*except==0), delete the provided exception.
    238 void __cfaehm_cleanup_terminate( void * except ) {
    239         if ( *(void**)except ) __cfaehm_delete_exception( *(exception_t **)except );
    240 }
    241 
    242230// The exception that is being thrown must already be stored.
    243231static __attribute__((noreturn)) void __cfaehm_begin_unwind(void) {
     
    257245        // the whole stack.
    258246
    259         // No handler found, go to the default operation.
    260         // Currently this will always be a cancellation.
    261247        if ( ret == _URC_END_OF_STACK ) {
    262                 __cfadbg_print_safe(exception, "Uncaught exception %p\n", &this_exception_storage);
    263 
    264                 __cfaehm_cancel_stack(this_exception_context()->current_exception);
     248                // No proper handler was found. This can be handled in many ways, C++ calls std::terminate.
     249                // Here we force unwind the stack, basically raising a cancellation.
     250                printf("Uncaught exception %p\n", &this_exception_storage);
     251
     252                ret = _Unwind_ForcedUnwind( &this_exception_storage, _Stop_Fn, (void*)0x22 );
     253                printf("UNWIND ERROR %d after force unwind\n", ret);
     254                abort();
    265255        }
    266256
  • tests/exceptions/.expect/resume.txt

    r730f4f1 r7c6b262  
    44end of try clause
    55Exiting: simple try clause
    6 
    7 catch-all
    86
    97throwing child exception
  • tests/exceptions/.expect/terminate.txt

    r730f4f1 r7c6b262  
    33simple catch
    44Exiting: simple catch clause
    5 
    6 catch-all
    75
    86throwing child exception
  • tests/exceptions/resume.cfa

    r730f4f1 r7c6b262  
    1919                loud_exit a = "simple catch clause";
    2020                printf("simple catch\n");
    21         }
    22         printf("\n");
    23 
    24         // Throw catch-all test.
    25         try {
    26                 throwResume &(zen){};
    27         } catchResume (exception_t * error) {
    28                 printf("catch-all\n");
    2921        }
    3022        printf("\n");
  • tests/exceptions/terminate.cfa

    r730f4f1 r7c6b262  
    1717                printf("end of try clause\n");
    1818        } catch (zen * error) {
    19                 loud_exit a = "simple catch clause";
     19        loud_exit a = "simple catch clause";
    2020                printf("simple catch\n");
    21         }
    22         printf("\n");
    23 
    24         // Throw catch-all test.
    25         try {
    26                 throw &(zen){};
    27         } catch (exception_t * error) {
    28                 printf("catch-all\n");
    2921        }
    3022        printf("\n");
Note: See TracChangeset for help on using the changeset viewer.