source: tests/exceptions/polymorphic.cfa@ cf444b6

ADT ast-experimental enum forall-pointer-decay jacob/cs343-translation new-ast-unique-expr pthread-emulation qualifiedEnum
Last change on this file since cf444b6 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: 1.2 KB
RevLine 
[21b0a23]1// Testing polymophic exception types.
2
3#include <exception.hfa>
4
[ecfd758]5EHM_FORALL_EXCEPTION(proxy, (T&), (T))();
[21b0a23]6
[ecfd758]7EHM_FORALL_VIRTUAL_TABLE(proxy, (int), proxy_int);
8EHM_FORALL_VIRTUAL_TABLE(proxy, (char), proxy_char);
[21b0a23]9
[8e2cb4a]10void proxy_test(void) {
[ecfd758]11 proxy(int) an_int = {&proxy_int};
12 proxy(char) a_char = {&proxy_char};
13
[21b0a23]14 try {
[ecfd758]15 throw an_int;
[21b0a23]16 } catch (proxy(int) *) {
17 printf("terminate catch\n");
18 }
19
20 try {
[ecfd758]21 throwResume a_char;
[21b0a23]22 } catchResume (proxy(char) *) {
23 printf("resume catch\n");
24 }
25
26 try {
[ecfd758]27 throw a_char;
[21b0a23]28 } catch (proxy(int) *) {
29 printf("caught proxy(int)\n");
30 } catch (proxy(char) *) {
31 printf("caught proxy(char)\n");
32 }
33}
34
[ecfd758]35EHM_FORALL_EXCEPTION(cell, (T), (T))(
[21b0a23]36 T data;
37);
38
[ecfd758]39EHM_FORALL_VIRTUAL_TABLE(cell, (int), int_cell);
40EHM_FORALL_VIRTUAL_TABLE(cell, (char), char_cell);
41EHM_FORALL_VIRTUAL_TABLE(cell, (bool), bool_cell);
[21b0a23]42
43void cell_test(void) {
44 try {
[ecfd758]45 cell(int) except = {&int_cell, -7};
[21b0a23]46 throw except;
47 } catch (cell(int) * error) {
48 printf("%d\n", error->data);
49 }
50
51 try {
[ecfd758]52 cell(bool) ball = {&bool_cell, false};
[21b0a23]53 throwResume ball;
54 printf("%i\n", ball.data);
55 } catchResume (cell(bool) * error) {
56 printf("%i\n", error->data);
57 error->data = true;
58 }
59}
60
61int main(int argc, char * argv[]) {
62 proxy_test();
63 printf("\n");
64 cell_test();
65}
Note: See TracBrowser for help on using the repository browser.