source: tests/exceptions/resume.cfa @ ecfd758

ADTarm-ehast-experimentalenumforall-pointer-decayjacob/cs343-translationnew-ast-unique-exprpthread-emulationqualifiedEnum
Last change on this file since ecfd758 was ecfd758, checked in by Andrew Beach <ajbeach@…>, 3 years ago

Major exception update, seperating type-ids from virtual tables. The major interface changes are done. There is a regression of ?Cancelled(T) to Some?Cancelled. There is some bits of code for the new verion of the ?Cancelled(T) interface already there. Not connected yet but I just reached the limit of what I wanted to do in one commit and then spent over a day cleaning up, so it will replace Some?Cancelled in a future commit.

  • Property mode set to 100644
File size: 2.8 KB
Line 
1// Resumption Exception Tests
2
3#include <exception.hfa>
4#include "except-io.hfa"
5
6EHM_EXCEPTION(yin)();
7EHM_EXCEPTION(yang)();
8EHM_EXCEPTION(zen)();
9
10EHM_VIRTUAL_TABLE(yin, yin_vt);
11EHM_VIRTUAL_TABLE(yang, yang_vt);
12EHM_VIRTUAL_TABLE(zen, zen_vt);
13
14void in_void(void);
15
16int main(int argc, char * argv[]) {
17        yin a_yin = {&yin_vt};
18        yang a_yang = {&yang_vt};
19        zen a_zen = {&zen_vt};
20
21        // The simple throw catchResume test.
22        try {
23                loud_exit a = "simple try clause";
24                printf("simple throw\n");
25                throwResume a_zen;
26                printf("end of try clause\n");
27        } catchResume (zen * error) {
28                loud_exit a = "simple catch clause";
29                printf("simple catch\n");
30        }
31        printf("\n");
32
33        // Throw catch-all test.
34        try {
35                throwResume a_zen;
36        } catchResume (exception_t * error) {
37                printf("catch-all\n");
38        }
39        printf("\n");
40
41        // Don't catch if handler does not match exception.
42        try {
43                try {
44                        throwResume a_yin;
45                } catchResume (zen *) {
46                        printf("caught yin as zen\n");
47                }
48        } catchResume (yang *) {
49                printf("caught yin as yang\n");
50        } catchResume (yin *) {
51                printf("caught yin as yin\n");
52        }
53        printf("\n");
54
55        // Test rethrowing an exception.
56        try {
57                try {
58                        loud_exit a = "rethrow inner try";
59                        printf("rethrow inner try\n");
60                        throwResume a_zen;
61                } catchResume (zen *) {
62                        loud_exit a = "rethrowing catch clause";
63                        printf("caught throw, will rethrow\n");
64                        throwResume;
65                }
66        } catchResume (zen *) {
67                loud_exit a = "rethrow catch clause";
68                printf("caught rethrow\n");
69        }
70        printf("\n");
71
72        // Throw a different exception in a catch.
73        try {
74                try {
75                        throwResume a_yin;
76                } catchResume (yin *) {
77                        printf("caught yin, will throw yang\n");
78                        throwResume a_yang;
79                } catchResume (yang *) {
80                        printf("caught exception from same try\n");
81                }
82        } catchResume (yang *) {
83                printf("caught yang\n");
84        }
85        printf("\n");
86
87        // Another throw in the catch does not interfere.
88        try {
89                try {
90                        printf("throwing first exception\n");
91                        throwResume a_yin;
92                } catchResume (yin *) {
93                        printf("caught first exception\n");
94                        try {
95                                printf("throwing second exception\n");
96                                throwResume a_yang;
97                        } catchResume (yang *) {
98                                printf("caught second exception\n");
99                        }
100                        throwResume;
101                }
102        } catchResume (yin *) {
103                printf("recaught first exception\n");
104        } catchResume (yang *) {
105                printf("caught second exception (bad location)\n");
106        }
107        printf("\n");
108
109        // Check successive operations.
110        try {
111                try {
112                        throwResume a_zen;
113                        throwResume a_zen;
114                } catchResume (zen *) {
115                        printf("inner catch\n");
116                }
117                throwResume a_zen;
118        } catchResume (zen *) {
119                printf("outer catch\n");
120        }
121        printf("\n");
122
123        in_void();
124}
125
126// Do a throw and rethrow in a void function.
127void in_void(void) {
128    zen a_zen = {&zen_vt};
129        try {
130                try {
131                        printf("throw\n");
132                        throwResume a_zen;
133                } catchResume (zen *) {
134                        printf("rethrow\n");
135                        throwResume;
136                }
137        } catchResume (zen *) {
138                printf("handle\n");
139        }
140}
Note: See TracBrowser for help on using the repository browser.