Ignore:
Timestamp:
Jun 16, 2017, 4:36:00 PM (7 years ago)
Author:
Andrew Beach <ajbeach@…>
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
Message:

Updates to exception handling and translation.

Location:
doc/working/exception/impl
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • doc/working/exception/impl/exception.c

    r0892b1b rc529a24  
    4444        __throw_terminate(except);
    4545        // TODO: Default handler for resumption.
     46}
     47
     48/* QUESTION: Could interupts interact with exception handling?
     49Ex. could an context switch stop execution, and we get an exception when we
     50come 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)
     55Which if an exception can come from anywhere, might just be required to ensure
     56the list is valid.
     57
     58void __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
     66void __try_resume_cleanup(struct __try_resume_node * node) {
     67        shared_stack.top_resume = node->next;
    4668}
    4769
  • doc/working/exception/impl/exception.h

    r0892b1b rc529a24  
    66
    77
    8 // These might be given simpler names and made public.
    98void __throw_terminate(exception except) __attribute__((noreturn));
    109void __rethrow_terminate(void) __attribute__((noreturn));
     
    2019};
    2120
     21void __try_resume_cleanup(struct __try_resume_node * node);
     22
    2223struct __cleanup_hook {};
    2324
     
    2728 * and threads means that... well I'm going to get it working ignoring those
    2829 * first, then get it working with concurrency.
     30 * Eventually there should be some global name that just gets you the right
     31 * data block.
    2932 */
    3033struct shared_stack_t {
    31         //struct lock lock;
    3234        struct __try_resume_node * top_resume;
    3335        struct __try_resume_node * current_resume;
  • doc/working/exception/impl/test-main.c

    r0892b1b rc529a24  
    66#include <stdbool.h>
    77
    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.
    1710void __try_resume_node_new(struct __try_resume_node * node,
    1811        _Bool (*handler)(exception except)) {
     
    2013    shared_stack.top_resume = node;
    2114    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;
    2615}
    2716
     
    122111                }
    123112                struct __try_resume_node node
    124                         __attribute__((cleanup(__try_resume_node_delete)));
     113                        __attribute__((cleanup(__try_resume_cleanup)));
    125114                __try_resume_node_new(&node, beta_handle1);
    126115                {
     
    144133                }
    145134                struct __try_resume_node node
    146                         __attribute__((cleanup(__try_resume_node_delete)));
     135                        __attribute__((cleanup(__try_resume_cleanup)));
    147136                __try_resume_node_new(&node, alpha_handle1);
    148137                {
     
    260249                }
    261250                struct __try_resume_node node
    262                         __attribute__((cleanup(__try_resume_node_delete)));
     251                        __attribute__((cleanup(__try_resume_cleanup)));
    263252                __try_resume_node_new(&node, fn_handle1);
    264253                {
     
    279268                }
    280269                struct __try_resume_node node
    281                         __attribute__((cleanup(__try_resume_node_delete)));
     270                        __attribute__((cleanup(__try_resume_cleanup)));
    282271                __try_resume_node_new(&node, fn_handle1);
    283272                {
     
    349338                }
    350339                struct __try_resume_node node
    351                         __attribute__((cleanup(__try_resume_node_delete)));
     340                        __attribute__((cleanup(__try_resume_cleanup)));
    352341                __try_resume_node_new(&node, reresume_handle1);
    353342                {
     
    361350                        }
    362351                        struct __try_resume_node node
    363                                 __attribute__((cleanup(__try_resume_node_delete)));
     352                                __attribute__((cleanup(__try_resume_cleanup)));
    364353                        __try_resume_node_new(&node, reresume_handle2);
    365354                        {
     
    409398                }
    410399                struct __try_resume_node node
    411                         __attribute__((cleanup(__try_resume_node_delete)));
     400                        __attribute__((cleanup(__try_resume_cleanup)));
    412401                __try_resume_node_new(&node, foe_handle1);
    413402                {
     
    456445                }
    457446                struct __try_resume_node node
    458                         __attribute__((cleanup(__try_resume_node_delete)));
     447                        __attribute__((cleanup(__try_resume_cleanup)));
    459448                __try_resume_node_new(&node, fee_handle1);
    460449                {
Note: See TracChangeset for help on using the changeset viewer.