Changeset c529a24
- Timestamp:
- Jun 16, 2017, 4:36:00 PM (7 years ago)
- Branches:
- ADT, aaron-thesis, arm-eh, ast-experimental, cleanup-dtors, deferred_resn, demangler, enum, forall-pointer-decay, jacob/cs343-translation, jenkins-sandbox, master, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, pthread-emulation, qualifiedEnum, resolv-new, with_gc
- Children:
- 365d553c
- Parents:
- 0892b1b
- Location:
- doc/working/exception
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
doc/working/exception/impl/exception.c
r0892b1b rc529a24 44 44 __throw_terminate(except); 45 45 // TODO: Default handler for resumption. 46 } 47 48 /* QUESTION: Could interupts interact with exception handling? 49 Ex. could an context switch stop execution, and we get an exception when we 50 come back? Is so resumption has to go: 51 + create node (init next and handler) 52 + prepare cleanup (add a cleanup hook with the ..._cleaup function) 53 also the cleanup has to be the next node, not just a pop from the list. 54 + push node on the list (change the existing node) 55 Which if an exception can come from anywhere, might just be required to ensure 56 the list is valid. 57 58 void __try_resume_setup(struct __try_resume_node * node, 59 bool (*handler)(exception except) { 60 node->next = shared_stack.top_resume; 61 node->try_to_handle = handler; 62 shared_stack.top_resume = node; 63 }*/ 64 65 // We have a single cleanup function 66 void __try_resume_cleanup(struct __try_resume_node * node) { 67 shared_stack.top_resume = node->next; 46 68 } 47 69 -
doc/working/exception/impl/exception.h
r0892b1b rc529a24 6 6 7 7 8 // These might be given simpler names and made public.9 8 void __throw_terminate(exception except) __attribute__((noreturn)); 10 9 void __rethrow_terminate(void) __attribute__((noreturn)); … … 20 19 }; 21 20 21 void __try_resume_cleanup(struct __try_resume_node * node); 22 22 23 struct __cleanup_hook {}; 23 24 … … 27 28 * and threads means that... well I'm going to get it working ignoring those 28 29 * first, then get it working with concurrency. 30 * Eventually there should be some global name that just gets you the right 31 * data block. 29 32 */ 30 33 struct shared_stack_t { 31 //struct lock lock;32 34 struct __try_resume_node * top_resume; 33 35 struct __try_resume_node * current_resume; -
doc/working/exception/impl/test-main.c
r0892b1b rc529a24 6 6 #include <stdbool.h> 7 7 8 // Translation Helpers: 9 #define CLEANUP(function) \ 10 struct __cleanup_hook __hidden_hook __attribute__((cleanup(function))) 11 12 #define SET_UP_RESUME_NODE(handler_function) \ 13 struct __try_resume_node node \ 14 __attribute__((cleanup(__try_resume_node_delete))); \ 15 __try_resume_node_new(&node, handler_function) 16 8 // Helps with manual translation. It may or may not get folded into the 9 // header, that depends on how it interacts with concurancy. 17 10 void __try_resume_node_new(struct __try_resume_node * node, 18 11 _Bool (*handler)(exception except)) { … … 20 13 shared_stack.top_resume = node; 21 14 node->try_to_handle = handler; 22 }23 24 void __try_resume_node_delete(struct __try_resume_node * node) {25 shared_stack.top_resume = node->next;26 15 } 27 16 … … 122 111 } 123 112 struct __try_resume_node node 124 __attribute__((cleanup(__try_resume_ node_delete)));113 __attribute__((cleanup(__try_resume_cleanup))); 125 114 __try_resume_node_new(&node, beta_handle1); 126 115 { … … 144 133 } 145 134 struct __try_resume_node node 146 __attribute__((cleanup(__try_resume_ node_delete)));135 __attribute__((cleanup(__try_resume_cleanup))); 147 136 __try_resume_node_new(&node, alpha_handle1); 148 137 { … … 260 249 } 261 250 struct __try_resume_node node 262 __attribute__((cleanup(__try_resume_ node_delete)));251 __attribute__((cleanup(__try_resume_cleanup))); 263 252 __try_resume_node_new(&node, fn_handle1); 264 253 { … … 279 268 } 280 269 struct __try_resume_node node 281 __attribute__((cleanup(__try_resume_ node_delete)));270 __attribute__((cleanup(__try_resume_cleanup))); 282 271 __try_resume_node_new(&node, fn_handle1); 283 272 { … … 349 338 } 350 339 struct __try_resume_node node 351 __attribute__((cleanup(__try_resume_ node_delete)));340 __attribute__((cleanup(__try_resume_cleanup))); 352 341 __try_resume_node_new(&node, reresume_handle1); 353 342 { … … 361 350 } 362 351 struct __try_resume_node node 363 __attribute__((cleanup(__try_resume_ node_delete)));352 __attribute__((cleanup(__try_resume_cleanup))); 364 353 __try_resume_node_new(&node, reresume_handle2); 365 354 { … … 409 398 } 410 399 struct __try_resume_node node 411 __attribute__((cleanup(__try_resume_ node_delete)));400 __attribute__((cleanup(__try_resume_cleanup))); 412 401 __try_resume_node_new(&node, foe_handle1); 413 402 { … … 456 445 } 457 446 struct __try_resume_node node 458 __attribute__((cleanup(__try_resume_ node_delete)));447 __attribute__((cleanup(__try_resume_cleanup))); 459 448 __try_resume_node_new(&node, fee_handle1); 460 449 { -
doc/working/exception/translate.c
r0892b1b rc529a24 17 17 18 18 void __throw_terminate(exception except) __attribute__((noreturn)); 19 void __rethrow_terminate() __attribute__((noreturn)); 19 20 void __throw_resume(exception except); 20 21 … … 27 28 bool (*try_to_handle)(exception except); 28 29 }; 30 31 void __try_resume_cleanup(struct __try_resume_node * node); 29 32 30 33 struct __cleanup_hook {}; … … 147 150 void try_resume() { 148 151 { 149 bool catch1(exception except) {152 bool handle1(exception except) { 150 153 OtherException inner_except; 151 154 if (dynamic_cast__SomeException(except)) { … … 161 164 } 162 165 struct __try_resume_node data = 163 {.next = stack.except.top_resume, .try_to_handle = catch1};166 {.next = stack.except.top_resume, .try_to_handle = handle1}; 164 167 stack.except.top_resume = &data; 165 168 … … 204 207 205 208 206 // Combining the Above: 209 // Resume + Finally: 210 "Cforall" 211 212 void try_resume_finally() { 213 try { 214 insideTry(); 215 } 216 catch resume (SomeException) { 217 fiddleThing(); 218 } 219 finally { 220 twiddleWidget(); 221 } 222 } 223 224 "C" 225 226 void try_resume_finally() { 227 { 228 void finally1() { 229 twiddleWidget(); 230 } 231 bool handle1(exception except) { 232 if (dynamic_cast__SomeException(except)) { 233 fiddleThing(); 234 return true; 235 } else { 236 return false; 237 } 238 } 239 struct __cleanup_hook generated_name 240 __attribute__((cleanup(finally1))); 241 242 struct __try_resume_node data = 243 {.next = stack.except.top_resume, .try_to_handle = handle1}; 244 stack.except.top_resume = &data; 245 246 struct __cleanup_hook generated_name 247 __attribute__((cleanup(__try_resume_cleanup))); 248 } 249 } 250 251 252 // Terminate + Resume + Finally: 207 253 "Cforall" 208 254 … … 226 272 void try_all() { 227 273 { 274 bool handle1() { 275 if (dynamic_cast__OtherException(except)) { 276 twiddleWidget(); 277 return true; 278 } 279 return false; 280 } 228 281 void try1 () { 282 struct __try_resume_node generated_name = 283 {.next = stack.except.top_resume, .try_to_handle = handle1} 284 __attribute__((cleanup(__try_resume_cleanup))); 285 stack.except.top_resume = &data; 286 229 287 insideTry(); 230 288 } … … 244 302 return 0; 245 303 } 246 bool catch2() {247 if (dynamic_cast__OtherException(except)) {248 twiddleWidget();249 return true;250 }251 return false;252 }253 304 void finally1() { 254 // Finally, because of timing, also works for resume.255 // However this might not actually be better in any way.256 __try_resume_cleanup();257 305 258 306 twiddleWidget(); 259 307 } 260 261 struct __try_resume_node generated_name =262 {.next = stack.except.top_resume, .try_to_handle = catch2};263 stack.except.top_resume = &data;264 308 struct __cleanup_hook generated_name 265 309 __attribute__((cleanup(finally1)));
Note: See TracChangeset
for help on using the changeset viewer.