Changes in / [42b0d73:4aa2fb2]
- Location:
- doc/working/exception
- Files:
-
- 4 edited
-
impl/exception.c (modified) (1 diff)
-
impl/exception.h (modified) (3 diffs)
-
impl/test-main.c (modified) (13 diffs)
-
translate.c (modified) (7 diffs)
Legend:
- Unmodified
- Added
- Removed
-
doc/working/exception/impl/exception.c
r42b0d73 r4aa2fb2 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 we50 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 ensure56 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 function66 void __try_resume_cleanup(struct __try_resume_node * node) {67 shared_stack.top_resume = node->next;68 46 } 69 47 -
doc/working/exception/impl/exception.h
r42b0d73 r4aa2fb2 6 6 7 7 8 // These might be given simpler names and made public. 8 9 void __throw_terminate(exception except) __attribute__((noreturn)); 9 10 void __rethrow_terminate(void) __attribute__((noreturn)); … … 19 20 }; 20 21 21 void __try_resume_cleanup(struct __try_resume_node * node);22 23 22 struct __cleanup_hook {}; 24 23 … … 28 27 * and threads means that... well I'm going to get it working ignoring those 29 28 * first, then get it working with concurrency. 30 * Eventually there should be some global name that just gets you the right31 * data block.32 29 */ 33 30 struct shared_stack_t { 31 //struct lock lock; 34 32 struct __try_resume_node * top_resume; 35 33 struct __try_resume_node * current_resume; -
doc/working/exception/impl/test-main.c
r42b0d73 r4aa2fb2 6 6 #include <stdbool.h> 7 7 8 // Helps with manual translation. It may or may not get folded into the 9 // header, that depends on how it interacts with concurancy. 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 10 17 void __try_resume_node_new(struct __try_resume_node * node, 11 18 _Bool (*handler)(exception except)) { … … 13 20 shared_stack.top_resume = node; 14 21 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; 15 26 } 16 27 … … 111 122 } 112 123 struct __try_resume_node node 113 __attribute__((cleanup(__try_resume_ cleanup)));124 __attribute__((cleanup(__try_resume_node_delete))); 114 125 __try_resume_node_new(&node, beta_handle1); 115 126 { … … 133 144 } 134 145 struct __try_resume_node node 135 __attribute__((cleanup(__try_resume_ cleanup)));146 __attribute__((cleanup(__try_resume_node_delete))); 136 147 __try_resume_node_new(&node, alpha_handle1); 137 148 { … … 142 153 143 154 // Finally Test: 144 void farewell( bool jump) {155 void farewell() { 145 156 { 146 157 void farewell_finally1() { … … 150 161 __attribute__((cleanup(farewell_finally1))); 151 162 { 152 if (jump) { 153 printf("jump out of farewell\n"); 154 goto endoffunction; 155 } else { 156 printf("walk out of farewell\n"); 157 } 158 } 159 } 160 endoffunction: 161 printf("leaving farewell\n"); 163 printf("walk out of farewell\n"); 164 } 165 } 162 166 } 163 167 … … 256 260 } 257 261 struct __try_resume_node node 258 __attribute__((cleanup(__try_resume_ cleanup)));262 __attribute__((cleanup(__try_resume_node_delete))); 259 263 __try_resume_node_new(&node, fn_handle1); 260 264 { … … 275 279 } 276 280 struct __try_resume_node node 277 __attribute__((cleanup(__try_resume_ cleanup)));281 __attribute__((cleanup(__try_resume_node_delete))); 278 282 __try_resume_node_new(&node, fn_handle1); 279 283 { … … 345 349 } 346 350 struct __try_resume_node node 347 __attribute__((cleanup(__try_resume_ cleanup)));351 __attribute__((cleanup(__try_resume_node_delete))); 348 352 __try_resume_node_new(&node, reresume_handle1); 349 353 { … … 357 361 } 358 362 struct __try_resume_node node 359 __attribute__((cleanup(__try_resume_ cleanup)));363 __attribute__((cleanup(__try_resume_node_delete))); 360 364 __try_resume_node_new(&node, reresume_handle2); 361 365 { … … 405 409 } 406 410 struct __try_resume_node node 407 __attribute__((cleanup(__try_resume_ cleanup)));411 __attribute__((cleanup(__try_resume_node_delete))); 408 412 __try_resume_node_new(&node, foe_handle1); 409 413 { … … 452 456 } 453 457 struct __try_resume_node node 454 __attribute__((cleanup(__try_resume_ cleanup)));458 __attribute__((cleanup(__try_resume_node_delete))); 455 459 __try_resume_node_new(&node, fee_handle1); 456 460 { … … 467 471 foo(); printf("\n"); 468 472 alpha(); printf("\n"); 469 farewell(false); printf("\n"); 470 farewell(true); printf("\n"); 473 farewell(); printf("\n"); 471 474 fallback(); printf("\n"); 472 475 terminate_swapped(); printf("\n"); -
doc/working/exception/translate.c
r42b0d73 r4aa2fb2 17 17 18 18 void __throw_terminate(exception except) __attribute__((noreturn)); 19 void __rethrow_terminate() __attribute__((noreturn));20 19 void __throw_resume(exception except); 21 20 … … 28 27 bool (*try_to_handle)(exception except); 29 28 }; 30 31 void __try_resume_cleanup(struct __try_resume_node * node);32 29 33 30 struct __cleanup_hook {}; … … 150 147 void try_resume() { 151 148 { 152 bool handle1(exception except) {149 bool catch1(exception except) { 153 150 OtherException inner_except; 154 151 if (dynamic_cast__SomeException(except)) { … … 164 161 } 165 162 struct __try_resume_node data = 166 {.next = stack.except.top_resume, .try_to_handle = handle1};163 {.next = stack.except.top_resume, .try_to_handle = catch1}; 167 164 stack.except.top_resume = &data; 168 165 … … 207 204 208 205 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: 206 // Combining the Above: 253 207 "Cforall" 254 208 … … 272 226 void try_all() { 273 227 { 274 bool handle1() {275 if (dynamic_cast__OtherException(except)) {276 twiddleWidget();277 return true;278 }279 return false;280 }281 228 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 287 229 insideTry(); 288 230 } … … 302 244 return 0; 303 245 } 246 bool catch2() { 247 if (dynamic_cast__OtherException(except)) { 248 twiddleWidget(); 249 return true; 250 } 251 return false; 252 } 304 253 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(); 305 257 306 258 twiddleWidget(); 307 259 } 260 261 struct __try_resume_node generated_name = 262 {.next = stack.except.top_resume, .try_to_handle = catch2}; 263 stack.except.top_resume = &data; 308 264 struct __cleanup_hook generated_name 309 265 __attribute__((cleanup(finally1)));
Note:
See TracChangeset
for help on using the changeset viewer.