Changeset e7d6968 for libcfa/src/exception.hfa
- Timestamp:
- Oct 23, 2020, 9:08:09 PM (3 years ago)
- Branches:
- ADT, arm-eh, ast-experimental, enum, forall-pointer-decay, jacob/cs343-translation, master, new-ast-unique-expr, pthread-emulation, qualifiedEnum
- Children:
- c532847
- Parents:
- 37b7d95 (diff), 3aec25f (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
libcfa/src/exception.hfa
r37b7d95 re7d6968 95 95 // visible anywhere you use the instantiation of the exception is used. 96 96 #define POLY_VTABLE_DECLARATION(exception_name, ...) \ 97 void mark_exception(exception_name(__VA_ARGS__) *); \97 VTABLE_TYPE(exception_name)(__VA_ARGS__) const & get_exception_vtable(exception_name(__VA_ARGS__) *); \ 98 98 extern VTABLE_TYPE(exception_name)(__VA_ARGS__) VTABLE_NAME(exception_name) 99 99 … … 125 125 #define VTABLE_ASSERTION(exception_name, parameters) \ 126 126 { VTABLE_TYPE(exception_name) parameters VTABLE_NAME(exception_name); } 127 128 // IS_EXCEPTION(exception_name [, (...parameters)]) 129 // IS_RESUMPTION_EXCEPTION(exception_name [, (parameters...)]) 130 // IS_TERMINATION_EXCEPTION(exception_name [, (parameters...)]) 131 // Create an assertion that exception_name, possibly with the qualifing parameters, is the given 132 // kind of exception with the standard vtable with the same parameters if applicable. 133 #define IS_EXCEPTION(...) _IS_EXCEPTION(is_exception, __VA_ARGS__, , ~) 134 #define IS_RESUMPTION_EXCEPTION(...) _IS_EXCEPTION(is_resumption_exception, __VA_ARGS__, , ~) 135 #define IS_TERMINATION_EXCEPTION(...) _IS_EXCEPTION(is_termination_exception, __VA_ARGS__, , ~) 127 136 128 137 // All internal helper macros begin with an underscore. … … 160 169 161 170 #define _FORALL_CTOR0_DECLARATION(exception_name, assertions, parameters) \ 162 forall(_UNPACK assertions | VTABLE_ASSERTION(exception_name, parameters) ) \ 171 forall(_UNPACK assertions | \ 172 is_exception(exception_name parameters, VTABLE_TYPE(exception_name) parameters)) \ 163 173 void ?{}(exception_name parameters & this) 164 174 165 175 #define _FORALL_CTOR0_INSTANCE(exception_name, assertions, parameters) \ 166 176 _FORALL_CTOR0_DECLARATION(exception_name, assertions, parameters) { \ 167 VTABLE_INIT(this, exception_name); \177 (this).virtual_table = &get_exception_vtable(&this); \ 168 178 } 169 179 … … 185 195 #define _VTABLE_DECLARATION(exception_name, parent_name, ...) \ 186 196 struct exception_name; \ 187 void mark_exception(exception_name *); \188 197 VTABLE_TYPE(exception_name); \ 198 VTABLE_TYPE(exception_name) const & get_exception_vtable(exception_name *); \ 189 199 extern VTABLE_TYPE(exception_name) VTABLE_NAME(exception_name); \ 190 200 VTABLE_TYPE(exception_name) { \ … … 197 207 198 208 #define _VTABLE_INSTANCE(exception_name, parent_name, ...) \ 199 void mark_exception(exception_name *) {} \ 209 VTABLE_TYPE(exception_name) const & get_exception_vtable(exception_name *) { \ 210 return VTABLE_NAME(exception_name); \ 211 } \ 200 212 void _GLUE2(exception_name,_copy)(exception_name * this, exception_name * other) { \ 201 213 *this = *other; \ … … 218 230 219 231 #define _POLY_VTABLE_INSTANCE(exception_name, parent_name, ...) \ 220 void mark_exception(exception_name(__VA_ARGS__) *) {} \ 232 extern VTABLE_TYPE(exception_name)(__VA_ARGS__) VTABLE_NAME(exception_name); \ 233 VTABLE_TYPE(exception_name)(__VA_ARGS__) const & get_exception_vtable( \ 234 exception_name(__VA_ARGS__) *) { \ 235 return VTABLE_NAME(exception_name); \ 236 } \ 221 237 void _GLUE2(exception_name,_copy)( \ 222 238 exception_name(__VA_ARGS__) * this, exception_name(__VA_ARGS__) * other) { \ … … 227 243 _GLUE2(exception_name,_copy), ^?{}, \ 228 244 _CLOSE 245 246 #define _IS_EXCEPTION(kind, exception_name, parameters, ...) \ 247 kind(exception_name parameters, VTABLE_TYPE(exception_name) parameters)
Note: See TracChangeset
for help on using the changeset viewer.