Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • doc/working/exception/impl/test-main.c

    r35ba584c re1055441  
    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                {
     
    153142
    154143// Finally Test:
    155 void farewell() {
     144void farewell(bool jump) {
    156145        {
    157146                void farewell_finally1() {
     
    161150                        __attribute__((cleanup(farewell_finally1)));
    162151                {
    163                         printf("walk out of farewell\n");
    164                 }
    165         }
     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");
    166162}
    167163
     
    260256                }
    261257                struct __try_resume_node node
    262                         __attribute__((cleanup(__try_resume_node_delete)));
     258                        __attribute__((cleanup(__try_resume_cleanup)));
    263259                __try_resume_node_new(&node, fn_handle1);
    264260                {
     
    279275                }
    280276                struct __try_resume_node node
    281                         __attribute__((cleanup(__try_resume_node_delete)));
     277                        __attribute__((cleanup(__try_resume_cleanup)));
    282278                __try_resume_node_new(&node, fn_handle1);
    283279                {
     
    349345                }
    350346                struct __try_resume_node node
    351                         __attribute__((cleanup(__try_resume_node_delete)));
     347                        __attribute__((cleanup(__try_resume_cleanup)));
    352348                __try_resume_node_new(&node, reresume_handle1);
    353349                {
     
    361357                        }
    362358                        struct __try_resume_node node
    363                                 __attribute__((cleanup(__try_resume_node_delete)));
     359                                __attribute__((cleanup(__try_resume_cleanup)));
    364360                        __try_resume_node_new(&node, reresume_handle2);
    365361                        {
     
    409405                }
    410406                struct __try_resume_node node
    411                         __attribute__((cleanup(__try_resume_node_delete)));
     407                        __attribute__((cleanup(__try_resume_cleanup)));
    412408                __try_resume_node_new(&node, foe_handle1);
    413409                {
     
    456452                }
    457453                struct __try_resume_node node
    458                         __attribute__((cleanup(__try_resume_node_delete)));
     454                        __attribute__((cleanup(__try_resume_cleanup)));
    459455                __try_resume_node_new(&node, fee_handle1);
    460456                {
     
    471467        foo(); printf("\n");
    472468        alpha(); printf("\n");
    473         farewell(); printf("\n");
     469        farewell(false); printf("\n");
     470        farewell(true); printf("\n");
    474471        fallback(); printf("\n");
    475472        terminate_swapped(); printf("\n");
Note: See TracChangeset for help on using the changeset viewer.