source: tests/exceptions/interact.cfa @ f1b6671

arm-ehjacob/cs343-translationnew-astnew-ast-unique-expr
Last change on this file since f1b6671 was f1b6671, checked in by Andrew Beach <ajbeach@…>, 19 months ago

Unwinding is now handled in exception handling code. That is used to fix one bug, other exception tests added. Noise from the change altered one other test.

  • Property mode set to 100644
File size: 2.4 KB
Line 
1// Testing Interactions Between Termination and Resumption
2
3#include "except-mac.hfa"
4#include "except-io.hfa"
5
6TRIVIAL_EXCEPTION(star);
7TRIVIAL_EXCEPTION(moon);
8
9int main(int argc, char * argv[]) {
10        // Resume falls back to terminate.
11        try {
12                THROW_RESUME(&(star){});
13        } catch (star *) {
14                printf("caught as termination\n");
15        }
16        // Variant of the above to check timing.
17        try {
18                loud_region a = "try block with resume throw";
19                THROW_RESUME(&(star){});
20        } catch (star *) {
21                printf("caught as termination\n");
22        } catchResume (star *) {
23                printf("intermediate rethrow\n");
24                throwResume;
25        }
26        printf("\n");
27
28        // Resume does not catch terminate.
29        try {
30                try {
31                        THROW(&(star){});
32                } catchResume (star *) {
33                        printf("resume catch on terminate\n");
34                }
35        } catchResume (star *) {
36                printf("resume catch on terminate\n");
37        } catch (star *) {
38                printf("terminate catch on terminate\n");
39        }
40        printf("\n");
41
42        // Terminate does not catch resume.
43        try {
44                try {
45                        THROW_RESUME(&(star){});
46                } catch (star *) {
47                        printf("terminate catch on resume\n");
48                }
49        } catch (star *) {
50                printf("terminate catch on resume\n");
51        } catchResume (star *) {
52                printf("resume catch on resume\n");
53        }
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        printf("\n");
89
90        // Unwinding a resumption catch does not break the system.
91        try {
92                try {
93                        try {
94                                try {
95                                        printf("throwing resume moon\n");
96                                        THROW_RESUME(&(moon){});
97                                } catch (star *) {
98                                        printf("termination catch\n");
99                                }
100                                printf("throwing resume star\n");
101                                THROW_RESUME(&(star){});
102                        } catchResume (star *) {
103                                printf("resumption star catch\n");
104                        }
105                } catchResume (moon *) {
106                        printf("resumption moon catch, will terminate\n");
107                        THROW(&(star){});
108                }
109        } catchResume (star *) {
110                printf("outermost catch (error)\n");
111        }
112}
Note: See TracBrowser for help on using the repository browser.