Changeset 3eb5a478


Ignore:
Timestamp:
Apr 2, 2020, 3:00:55 PM (18 months ago)
Author:
Andrew Beach <ajbeach@…>
Branches:
arm-eh, jacob/cs343-translation, master, new-ast, new-ast-unique-expr
Children:
0f3d844
Parents:
6d43cdde
Message:

Fixed the disabled exceptions/resume test. Added more tests in exceptions/interact, one of which is disabled.

Files:
5 edited

Legend:

Unmodified
Added
Removed
  • libcfa/src/exception.c

    r6d43cdde r3eb5a478  
    1010// Created On       : Mon Jun 26 15:13:00 2017
    1111// Last Modified By : Andrew Beach
    12 // Last Modified On : Fri Mar 27 10:19:00 2020
    13 // Update Count     : 12
     12// Last Modified On : Thr Apr 02 14:47:00 2020
     13// Update Count     : 13
    1414//
    1515
     
    5353// Temperary global exception context. Does not work with concurency.
    5454struct exception_context_t {
    55     struct __cfaehm_try_resume_node * top_resume;
    56     struct __cfaehm_try_resume_node * current_resume;
    57 
    58     exception_t * current_exception;
    59     int current_handler_index;
    60 } static shared_stack = {NULL, NULL, NULL, 0};
     55        struct __cfaehm_try_resume_node * top_resume;
     56
     57        exception_t * current_exception;
     58        int current_handler_index;
     59} static shared_stack = {NULL, NULL, 0};
    6160
    6261// Get the current exception context.
     
    7574        __cfaabi_dbg_print_safe("Throwing resumption exception\n");
    7675
    77         struct __cfaehm_try_resume_node * original_head = context->current_resume;
    78         struct __cfaehm_try_resume_node * current =
    79                 (original_head) ? original_head->next : context->top_resume;
     76        struct __cfaehm_try_resume_node * original_head = context->top_resume;
     77        struct __cfaehm_try_resume_node * current = context->top_resume;
    8078
    8179        for ( ; current ; current = current->next) {
    82                 context->current_resume = current;
     80                context->top_resume = current->next;
    8381                if (current->handler(except)) {
    84                         context->current_resume = original_head;
     82                        context->top_resume = original_head;
    8583                        return;
    8684                }
     
    8886
    8987        __cfaabi_dbg_print_safe("Unhandled exception\n");
    90         context->current_resume = original_head;
     88        context->top_resume = original_head;
    9189
    9290        // Fall back to termination:
  • tests/exceptions/.expect/interact.txt

    r6d43cdde r3eb5a478  
    88
    99resume catch on resume
     10
     11termination catch, will resume
     12outer resume catch
     13
     14resumption catch, will terminate
     15inner termination catch
  • tests/exceptions/.expect/resume.txt

    r6d43cdde r3eb5a478  
    1919caught yin, will throw yang
    2020caught yang
     21
     22throwing first exception
     23caught first exception
     24throwing second exception
     25caught second exception
     26recaught first exception
  • tests/exceptions/interact.cfa

    r6d43cdde r3eb5a478  
    55
    66TRIVIAL_EXCEPTION(star);
     7TRIVIAL_EXCEPTION(moon);
    78
    89int main(int argc, char * argv[]) {
     
    5152                printf("resume catch on resume\n");
    5253        }
     54        printf("\n");
     55
     56        // Resume a termination exception.
     57        try {
     58                try {
     59                        try {
     60                                THROW(&(star){});
     61                        } catchResume (star *) {
     62                                printf("inner resume catch (error)\n");
     63                        }
     64                } catch (star * error) {
     65                        printf("termination catch, will resume\n");
     66                        THROW_RESUME(error);
     67                }
     68        } catchResume (star *) {
     69                printf("outer resume catch\n");
     70        }
     71        printf("\n");
     72
     73        // Terminate a resumption exception.
     74        try {
     75                try {
     76                        try {
     77                                THROW_RESUME(&(star){});
     78                        } catch (star *) {
     79                                printf("inner termination catch\n");
     80                        }
     81                } catchResume (star * error) {
     82                        printf("resumption catch, will terminate\n");
     83                        THROW(error);
     84                }
     85        } catch (star *) {
     86                printf("outer terminate catch (error)\n");
     87        }
     88#if 0
     89        printf("\n");
     90
     91        // Unwinding a resumption catch does not break the system.
     92        try {
     93                try {
     94                        try {
     95                                try {
     96                                        printf("throwing resume moon\n");
     97                                        THROW_RESUME(&(moon){});
     98                                } catch (star *) {
     99                                        printf("termination catch\n");
     100                                }
     101                                printf("throwing resume star\n");
     102                                THROW_RESUME(&(star){});
     103                        } catchResume (star *) {
     104                                printf("resumption star catch\n");
     105                        }
     106                } catchResume (moon *) {
     107                        printf("resumption moon catch, will terminate\n");
     108                        THROW(&(star){});
     109                }
     110        } catchResume (star *) {
     111                printf("outermost catch (error)\n");
     112        }
     113#endif
    53114}
  • tests/exceptions/resume.cfa

    r6d43cdde r3eb5a478  
    7777                printf("caught yang\n");
    7878        }
    79 #ifdef FAILING
    8079        printf("\n");
    8180
     
    10099                printf("caught second exception (bad location)\n");
    101100        }
    102 #endif
    103101}
Note: See TracChangeset for help on using the changeset viewer.