source: tests/exceptions/resume.cfa@ b51e389c

ADT ast-experimental enum forall-pointer-decay jacob/cs343-translation new-ast-unique-expr pthread-emulation qualifiedEnum
Last change on this file since b51e389c was ecfd758, checked in by Andrew Beach <ajbeach@…>, 4 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.