Changes in libcfa/src/exception.h [c960331:bf71cfd]
- File:
-
- 1 edited
-
libcfa/src/exception.h (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
libcfa/src/exception.h
rc960331 rbf71cfd 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // exception.h -- Internal exception handling definitions.7 // exception.h -- Builtins for exception handling. 8 8 // 9 9 // Author : Andrew Beach 10 10 // Created On : Mon Jun 26 15:11:00 2017 11 // Last Modified By : Andrew Beach12 // Last Modified On : T ue Oct 27 14:45:00 202013 // Update Count : 1111 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Thu Feb 22 18:11:15 2018 13 // Update Count : 8 14 14 // 15 15 16 16 #pragma once 17 17 18 // This could be considered several headers. All are internal to the exception19 // system but needed to depending on whether they are C/Cforall code and20 // whether or not they are part of the builtins.21 18 22 19 #ifdef __cforall … … 24 21 #endif 25 22 26 // Included in C code or the built-ins. 27 #if !defined(__cforall) || defined(__cforall_builtins__) 28 29 struct __cfaehm_base_exception_t; 30 typedef struct __cfaehm_base_exception_t exception_t; 31 struct __cfaehm_base_exception_t_vtable { 32 const struct __cfaehm_base_exception_t_vtable * parent; 23 struct __cfaabi_ehm__base_exception_t; 24 typedef struct __cfaabi_ehm__base_exception_t exception_t; 25 struct __cfaabi_ehm__base_exception_t_vtable { 26 const struct __cfaabi_ehm__base_exception_t_vtable * parent; 33 27 size_t size; 34 void (*copy)(struct __cfa ehm_base_exception_t *this,35 struct __cfa ehm_base_exception_t * other);36 void (*free)(struct __cfa ehm_base_exception_t *this);37 const char * (*msg)(struct __cfa ehm_base_exception_t *this);28 void (*copy)(struct __cfaabi_ehm__base_exception_t *this, 29 struct __cfaabi_ehm__base_exception_t * other); 30 void (*free)(struct __cfaabi_ehm__base_exception_t *this); 31 const char * (*msg)(struct __cfaabi_ehm__base_exception_t *this); 38 32 }; 39 struct __cfa ehm_base_exception_t {40 struct __cfa ehm_base_exception_t_vtable const * virtual_table;33 struct __cfaabi_ehm__base_exception_t { 34 struct __cfaabi_ehm__base_exception_t_vtable const * virtual_table; 41 35 }; 42 extern struct __cfa ehm_base_exception_t_vtable43 ___cfa ehm_base_exception_t_vtable_instance;36 extern struct __cfaabi_ehm__base_exception_t_vtable 37 ___cfaabi_ehm__base_exception_t_vtable_instance; 44 38 45 39 46 void __cfaehm_cancel_stack(exception_t * except) __attribute__((noreturn));47 48 40 // Used in throw statement translation. 49 void __cfa ehm_throw_terminate(exception_t * except, void (*)(exception_t *));50 void __cfa ehm_rethrow_terminate() __attribute__((noreturn));51 void __cfa ehm_throw_resume(exception_t * except, void (*)(exception_t *));41 void __cfaabi_ehm__throw_terminate(exception_t * except) __attribute__((noreturn)); 42 void __cfaabi_ehm__rethrow_terminate() __attribute__((noreturn)); 43 void __cfaabi_ehm__throw_resume(exception_t * except); 52 44 53 45 // Function catches termination exceptions. 54 void __cfa ehm_try_terminate(55 void (*try_block)(),56 void (*catch_block)(int index, exception_t * except),57 int (*match_block)(exception_t * except));46 void __cfaabi_ehm__try_terminate( 47 void (*try_block)(), 48 void (*catch_block)(int index, exception_t * except), 49 int (*match_block)(exception_t * except)); 58 50 59 51 // Clean-up the exception in catch blocks. 60 void __cfa ehm_cleanup_terminate(void * except);52 void __cfaabi_ehm__cleanup_terminate(void * except); 61 53 62 54 // Data structure creates a list of resume handlers. 63 struct __cfa ehm_try_resume_node {64 struct __cfaehm_try_resume_node * next;65 _Bool (*handler)(exception_t * except);55 struct __cfaabi_ehm__try_resume_node { 56 struct __cfaabi_ehm__try_resume_node * next; 57 _Bool (*handler)(exception_t * except); 66 58 }; 67 59 68 60 // These act as constructor and destructor for the resume node. 69 void __cfa ehm_try_resume_setup(70 struct __cfaehm_try_resume_node * node,71 _Bool (*handler)(exception_t * except));72 void __cfa ehm_try_resume_cleanup(73 struct __cfaehm_try_resume_node * node);61 void __cfaabi_ehm__try_resume_setup( 62 struct __cfaabi_ehm__try_resume_node * node, 63 _Bool (*handler)(exception_t * except)); 64 void __cfaabi_ehm__try_resume_cleanup( 65 struct __cfaabi_ehm__try_resume_node * node); 74 66 75 67 // Check for a standard way to call fake deconstructors. 76 struct __cfaehm_cleanup_hook {}; 77 78 #endif 79 80 // Included in C code and the library. 81 #if !defined(__cforall) || !defined(__cforall_builtins__) 82 struct __cfaehm_node { 83 struct _Unwind_Exception unwind_exception; 84 struct __cfaehm_node * next; 85 int handler_index; 86 }; 87 88 static inline exception_t * __cfaehm_cancellation_exception( 89 struct _Unwind_Exception * unwind_exception ) { 90 return (exception_t *)(1 + (struct __cfaehm_node *)unwind_exception); 91 } 92 #endif 68 struct __cfaabi_ehm__cleanup_hook {}; 93 69 94 70 #ifdef __cforall 95 71 } 96 97 // Built-ins not visible in C.98 #if defined(__cforall_builtins__)99 100 // Not all the built-ins can be expressed in C. These can't be101 // implemented in the .c file either so they all have to be inline.102 103 trait is_exception(dtype exceptT, dtype virtualT) {104 /* The first field must be a pointer to a virtual table.105 * That virtual table must be a decendent of the base exception virtual table.106 */107 virtualT const & get_exception_vtable(exceptT *);108 // Always returns the virtual table for this type (associated types hack).109 };110 111 trait is_termination_exception(dtype exceptT, dtype virtualT | is_exception(exceptT, virtualT)) {112 void defaultTerminationHandler(exceptT &);113 };114 115 trait is_resumption_exception(dtype exceptT, dtype virtualT | is_exception(exceptT, virtualT)) {116 void defaultResumptionHandler(exceptT &);117 };118 119 forall(dtype exceptT, dtype virtualT | is_termination_exception(exceptT, virtualT))120 static inline void $throw(exceptT & except) {121 __cfaehm_throw_terminate(122 (exception_t *)&except,123 (void(*)(exception_t *))defaultTerminationHandler124 );125 }126 127 forall(dtype exceptT, dtype virtualT | is_resumption_exception(exceptT, virtualT))128 static inline void $throwResume(exceptT & except) {129 __cfaehm_throw_resume(130 (exception_t *)&except,131 (void(*)(exception_t *))defaultResumptionHandler132 );133 }134 135 forall(dtype exceptT, dtype virtualT | is_exception(exceptT, virtualT))136 static inline void cancel_stack(exceptT & except) __attribute__((noreturn)) {137 __cfaehm_cancel_stack( (exception_t *)&except );138 }139 140 forall(dtype exceptT, dtype virtualT | is_exception(exceptT, virtualT))141 static inline void defaultTerminationHandler(exceptT & except) {142 return cancel_stack( except );143 }144 145 forall(dtype exceptT, dtype virtualT | is_exception(exceptT, virtualT))146 static inline void defaultResumptionHandler(exceptT & except) {147 throw except;148 }149 150 72 #endif 151 152 #endif
Note:
See TracChangeset
for help on using the changeset viewer.