Index: doc/theses/andrew_beach_MMath/code/CondMatch.java
===================================================================
--- doc/theses/andrew_beach_MMath/code/CondMatch.java	(revision ea593a3145f5e63bdf6cbcf2b052c10bc7de6cd5)
+++ doc/theses/andrew_beach_MMath/code/CondMatch.java	(revision ea593a3145f5e63bdf6cbcf2b052c10bc7de6cd5)
@@ -0,0 +1,40 @@
+// Conditional Match (or Re-Raise)
+
+class EmptyException extends Exception {}
+
+public class CondMatch {
+	static boolean should_catch = false;
+
+	static void throw_exception() throws EmptyException {
+		throw new EmptyException();
+	}
+
+	static void cond_catch() throws EmptyException {
+		try {
+			throw_exception();
+		} catch (EmptyException exc) {
+			if (!should_catch) {
+				throw exc;
+			}
+		}
+	}
+
+	public static void main(String[] args) {
+		int times = 1;
+		int total_frames = 1;
+		if (0 < args.length) {
+			times = Integer.parseInt(args[0]);
+		}
+		if (1 < args.length) {
+			total_frames = Integer.parseInt(args[1]);
+		}
+
+		for (int count = 0 ; count < times ; ++count) {
+			try {
+				cond_catch();
+			} catch (EmptyException exc) {
+				// ...
+			}
+		}
+	}
+}
Index: doc/theses/andrew_beach_MMath/code/CrossCatch.java
===================================================================
--- doc/theses/andrew_beach_MMath/code/CrossCatch.java	(revision ea593a3145f5e63bdf6cbcf2b052c10bc7de6cd5)
+++ doc/theses/andrew_beach_MMath/code/CrossCatch.java	(revision ea593a3145f5e63bdf6cbcf2b052c10bc7de6cd5)
@@ -0,0 +1,23 @@
+// Enter and Leave a Try Statement with a Termination Handler
+
+class NotRaisedException extends Exception {}
+
+public class CrossCatch {
+	public static void main(String[] args) {
+		int times = 1;
+		boolean shouldThrow = false;
+		if (0 < args.length) {
+			times = Integer.parseInt(args[0]);
+		}
+
+		for (int count = 0 ; count < times ; ++count) {
+			try {
+				if (shouldThrow) {
+					throw new NotRaisedException();
+				}
+			} catch (NotRaisedException e) {
+				// ...
+			}
+		}
+	}
+}
Index: doc/theses/andrew_beach_MMath/code/CrossFinally.java
===================================================================
--- doc/theses/andrew_beach_MMath/code/CrossFinally.java	(revision ea593a3145f5e63bdf6cbcf2b052c10bc7de6cd5)
+++ doc/theses/andrew_beach_MMath/code/CrossFinally.java	(revision ea593a3145f5e63bdf6cbcf2b052c10bc7de6cd5)
@@ -0,0 +1,19 @@
+// Cross a Try Statement with a Finally Clause
+
+public class CrossFinally {
+	public static void main(String[] args) {
+		int times = 1;
+		boolean shouldThrow = false;
+		if (0 < args.length) {
+			times = Integer.parseInt(args[0]);
+		}
+
+		for (int count = 0 ; count < times ; ++count) {
+			try {
+				// ...
+			} finally {
+				// ...
+			}
+		}
+	}
+}
Index: doc/theses/andrew_beach_MMath/code/ThrowEmpty.java
===================================================================
--- doc/theses/andrew_beach_MMath/code/ThrowEmpty.java	(revision ea593a3145f5e63bdf6cbcf2b052c10bc7de6cd5)
+++ doc/theses/andrew_beach_MMath/code/ThrowEmpty.java	(revision ea593a3145f5e63bdf6cbcf2b052c10bc7de6cd5)
@@ -0,0 +1,32 @@
+// Throw Across Empty Function
+
+class EmptyException extends Exception {}
+
+public class ThrowEmpty {
+	static void unwind_empty(int frames) throws EmptyException {
+		if (0 < frames) {
+			unwind_empty(frames - 1);
+		} else {
+			throw new EmptyException();
+		}
+	}
+
+	public static void main(String[] args) {
+		int times = 1;
+		int total_frames = 1;
+		if (0 < args.length) {
+			times = Integer.parseInt(args[0]);
+		}
+		if (1 < args.length) {
+			total_frames = Integer.parseInt(args[1]);
+		}
+
+		for (int count = 0 ; count < times ; ++count) {
+			try {
+				unwind_empty(total_frames);
+			} catch (EmptyException e) {
+				// ...
+			}
+		}
+	}
+}
Index: doc/theses/andrew_beach_MMath/code/ThrowFinally.java
===================================================================
--- doc/theses/andrew_beach_MMath/code/ThrowFinally.java	(revision ea593a3145f5e63bdf6cbcf2b052c10bc7de6cd5)
+++ doc/theses/andrew_beach_MMath/code/ThrowFinally.java	(revision ea593a3145f5e63bdf6cbcf2b052c10bc7de6cd5)
@@ -0,0 +1,33 @@
+// Throw Across Finally
+
+class EmptyException extends Exception {}
+
+public class ThrowFinally {
+	private static void unwind_finally(int frames)
+			throws EmptyException {
+		if (0 < frames) {
+			unwind_finally(frames - 1);
+		} else {
+			throw new EmptyException();
+		}
+	}
+
+	public static void main(String[] args) {
+		int times = 1;
+		int total_frames = 1;
+		if (0 < args.length) {
+			times = Integer.parseInt(args[0]);
+		}
+		if (1 < args.length) {
+			total_frames = Integer.parseInt(args[1]);
+		}
+
+		for (int count = 0 ; count < times ; ++count) {
+			try {
+				unwind_finally(total_frames);
+			} catch (EmptyException e) {
+				// ...
+			}
+		}
+	}
+}
Index: doc/theses/andrew_beach_MMath/code/ThrowOther.java
===================================================================
--- doc/theses/andrew_beach_MMath/code/ThrowOther.java	(revision ea593a3145f5e63bdf6cbcf2b052c10bc7de6cd5)
+++ doc/theses/andrew_beach_MMath/code/ThrowOther.java	(revision ea593a3145f5e63bdf6cbcf2b052c10bc7de6cd5)
@@ -0,0 +1,46 @@
+// Throw Across Other Handler
+
+class EmptyException extends Exception {}
+
+class NotRaisedException extends Exception {}
+
+public class ThrowOther {
+	static boolean should_throw = false;
+
+	private static void unwind_other(int frames)
+			throws EmptyException, NotRaisedException {
+		if (0 < frames) {
+			try {
+				unwind_other(frames - 1);
+			} catch (NotRaisedException e) {
+				// ...
+			}
+		} else {
+			if (should_throw) {
+				throw new NotRaisedException();
+			}
+			throw new EmptyException();
+		}
+	}
+
+	public static void main(String[] args) {
+		int times = 1;
+		int total_frames = 1;
+		if (0 < args.length) {
+			times = Integer.parseInt(args[0]);
+		}
+		if (1 < args.length) {
+			total_frames = Integer.parseInt(args[1]);
+		}
+
+		for (int count = 0 ; count < times ; ++count) {
+			try {
+				unwind_other(total_frames);
+			} catch (EmptyException e) {
+				// ...
+			} catch (NotRaisedException e) {
+				// ...
+			}
+		}
+	}
+}
Index: doc/theses/andrew_beach_MMath/code/cond-match-r.cfa
===================================================================
--- doc/theses/andrew_beach_MMath/code/cond-match-r.cfa	(revision ea593a3145f5e63bdf6cbcf2b052c10bc7de6cd5)
+++ doc/theses/andrew_beach_MMath/code/cond-match-r.cfa	(revision ea593a3145f5e63bdf6cbcf2b052c10bc7de6cd5)
@@ -0,0 +1,40 @@
+// Conditional Match (or Re-Raise)
+#include <exception.hfa>
+#include <stdlib.hfa>
+
+EHM_EXCEPTION(empty_exception)();
+
+EHM_VIRTUAL_TABLE(empty_exception, empty_vt);
+
+bool should_catch = false;
+
+void throw_exception() {
+	throw (empty_exception){&empty_vt};
+}
+
+void cond_catch() {
+	try {
+		throw_exception();
+	} catch (empty_exception * exc ; should_catch) {
+		// ...
+	}
+}
+
+int main(int argc, char * argv[]) {
+	unsigned int times = 1;
+	unsigned int total_frames = 1;
+	if (2 < argc) {
+		times = strtol(argv[1], 0p, 10);
+	}
+	if (3 < argc) {
+		total_frames = strtol(argv[2], 0p, 10);
+	}
+
+	for (unsigned int count = 0 ; count < times ; ++count) {
+		try {
+			cond_catch();
+		} catch (empty_exception * exc) {
+			// ...
+		}
+	}
+}
Index: doc/theses/andrew_beach_MMath/code/cond-match.cfa
===================================================================
--- doc/theses/andrew_beach_MMath/code/cond-match.cfa	(revision ea593a3145f5e63bdf6cbcf2b052c10bc7de6cd5)
+++ doc/theses/andrew_beach_MMath/code/cond-match.cfa	(revision ea593a3145f5e63bdf6cbcf2b052c10bc7de6cd5)
@@ -0,0 +1,36 @@
+// Conditional Match (or Re-Raise)
+#include <exception.hfa>
+#include <stdlib.h>
+
+EHM_EXCEPTION(empty_exception)();
+
+EHM_VIRTUAL_TABLE(empty_exception, empty_vt);
+
+bool should_catch = false;
+
+void throw_exception() {
+	throw (empty_exception){&empty_vt};
+}
+
+void cond_catch() {
+	try {
+		throw_exception();
+	} catch (empty_exception * exc ; should_catch) {
+		// ...
+	}
+}
+
+int main(int argc, char * argv[]) {
+	unsigned int times = 1;
+	if (2 < argc) {
+		times = strtol(argv[1], 0p, 10);
+	}
+
+	for (unsigned int count = 0 ; count < times ; ++count) {
+		try {
+			cond_catch();
+		} catch (empty_exception * exc) {
+			// ...
+		}
+	}
+}
Index: doc/theses/andrew_beach_MMath/code/cond-match.cpp
===================================================================
--- doc/theses/andrew_beach_MMath/code/cond-match.cpp	(revision ea593a3145f5e63bdf6cbcf2b052c10bc7de6cd5)
+++ doc/theses/andrew_beach_MMath/code/cond-match.cpp	(revision ea593a3145f5e63bdf6cbcf2b052c10bc7de6cd5)
@@ -0,0 +1,40 @@
+// Conditional Match (or Re-Raise)
+#include <exception>
+#include <cstdlib>
+
+struct EmptyException : public std::exception {};
+
+bool should_catch = false;
+
+void throw_exception() {
+	throw EmptyException();
+}
+
+void cond_catch() {
+	try {
+		throw_exception();
+	} catch (EmptyException & exc) {
+		if (should_catch) {
+			throw;
+		}
+	}
+}
+
+int main(int argc, char * argv[]) {
+	unsigned int times = 1;
+	unsigned int total_frames = 1;
+	if (2 < argc) {
+		times = strtol(argv[1], nullptr, 10);
+	}
+	if (3 < argc) {
+		total_frames = strtol(argv[2], nullptr, 10);
+	}
+
+    for (unsigned int count = 0 ; count < times ; ++count) {
+        try {
+			cond_catch();
+		} catch (EmptyException &) {
+			// ...
+		}
+    }
+}
Index: doc/theses/andrew_beach_MMath/code/cross-catch.cfa
===================================================================
--- doc/theses/andrew_beach_MMath/code/cross-catch.cfa	(revision ea593a3145f5e63bdf6cbcf2b052c10bc7de6cd5)
+++ doc/theses/andrew_beach_MMath/code/cross-catch.cfa	(revision ea593a3145f5e63bdf6cbcf2b052c10bc7de6cd5)
@@ -0,0 +1,24 @@
+// Cross a Try Statement with a Termination Handler
+#include <exception.hfa>
+#include <stdlib.hfa>
+
+EHM_EXCEPTION(not_raised_exception)();
+
+int main(int argc, char * argv[]) {
+	unsigned int times = 1;
+	unsigned int total_frames = 1;
+	if (2 < argc) {
+		times = strtol(argv[1], 0p, 10);
+	}
+	if (3 < argc) {
+		total_frames = strtol(argv[2], 0p, 10);
+	}
+
+	for (unsigned int count = 0 ; count < times ; ++count) {
+		try {
+			// ...
+		} catch (not_raised_exception *) {
+			// ...
+		}
+	}
+}
Index: doc/theses/andrew_beach_MMath/code/cross-catch.cpp
===================================================================
--- doc/theses/andrew_beach_MMath/code/cross-catch.cpp	(revision ea593a3145f5e63bdf6cbcf2b052c10bc7de6cd5)
+++ doc/theses/andrew_beach_MMath/code/cross-catch.cpp	(revision ea593a3145f5e63bdf6cbcf2b052c10bc7de6cd5)
@@ -0,0 +1,20 @@
+// Cross a Try Statement with a Termination Handler
+#include <exception>
+#include <cstdlib>
+
+struct NotRaisedException : public std::exception {};
+
+int main(int argc, char * argv[]) {
+	unsigned int times = 1;
+	if (2 < argc) {
+		times = strtol(argv[1], nullptr, 10);
+	}
+
+	for (unsigned int count = 0 ; count < times ; ++count) {
+		try {
+			// ...
+		} catch (NotRaisedException &) {
+			// ...
+		}
+	}
+}
Index: doc/theses/andrew_beach_MMath/code/cross-finally.cfa
===================================================================
--- doc/theses/andrew_beach_MMath/code/cross-finally.cfa	(revision ea593a3145f5e63bdf6cbcf2b052c10bc7de6cd5)
+++ doc/theses/andrew_beach_MMath/code/cross-finally.cfa	(revision ea593a3145f5e63bdf6cbcf2b052c10bc7de6cd5)
@@ -0,0 +1,22 @@
+// Cross a Try Statement With Finally Clause
+#include <exception.hfa>
+#include <stdlib.hfa>
+
+int main(int argc, char * argv[]) {
+	unsigned int times = 1;
+	unsigned int total_frames = 1;
+	if (2 < argc) {
+		times = strtol(argv[1], 0p, 10);
+	}
+	if (3 < argc) {
+		total_frames = strtol(argv[2], 0p, 10);
+	}
+
+	for (unsigned int count = 0 ; count < times ; ++count) {
+		 try {
+			// ...
+		} finally {
+			// ...
+		}
+	}
+}
Index: doc/theses/andrew_beach_MMath/code/cross-resume.cfa
===================================================================
--- doc/theses/andrew_beach_MMath/code/cross-resume.cfa	(revision ea593a3145f5e63bdf6cbcf2b052c10bc7de6cd5)
+++ doc/theses/andrew_beach_MMath/code/cross-resume.cfa	(revision ea593a3145f5e63bdf6cbcf2b052c10bc7de6cd5)
@@ -0,0 +1,24 @@
+// Cross a Try Statement With Finally Clause
+#include <exception.hfa>
+#include <stdlib.hfa>
+
+EHM_EXCEPTION(not_raised_exception)();
+
+int main(int argc, char * argv[]) {
+	unsigned int times = 1;
+	unsigned int total_frames = 1;
+	if (2 < argc) {
+		times = strtol(argv[1], 0p, 10);
+	}
+	if (3 < argc) {
+		total_frames = strtol(argv[2], 0p, 10);
+	}
+
+	for (unsigned int count = 0 ; count < times ; ++count) {
+		try {
+			// ...
+		} catchResume (not_raised_exception *) {
+			// ...
+		}
+	}
+}
Index: doc/theses/andrew_beach_MMath/code/resume-detor.cfa
===================================================================
--- doc/theses/andrew_beach_MMath/code/resume-detor.cfa	(revision ea593a3145f5e63bdf6cbcf2b052c10bc7de6cd5)
+++ doc/theses/andrew_beach_MMath/code/resume-detor.cfa	(revision ea593a3145f5e63bdf6cbcf2b052c10bc7de6cd5)
@@ -0,0 +1,42 @@
+// Throw Across Destructor
+#include <exception.hfa>
+#include <stdlib.hfa>
+
+EHM_EXCEPTION(empty_exception)();
+
+EHM_VIRTUAL_TABLE(empty_exception, empty_vt);
+
+struct WithDestructor {};
+
+void ^?{}(WithDestructor & this) {
+    // ...
+}
+
+void unwind_destructor(unsigned int frames) {
+    if (frames) {
+
+        WithDestructor object;
+        unwind_destructor(frames - 1);
+    } else {
+        throwResume (empty_exception){&empty_vt};
+    }
+}
+
+int main(int argc, char * argv[]) {
+	unsigned int times = 1;
+	unsigned int total_frames = 1;
+	if (2 < argc) {
+		times = strtol(argv[1], 0p, 10);
+	}
+	if (3 < argc) {
+		total_frames = strtol(argv[2], 0p, 10);
+	}
+
+    for (int count = 0 ; count < times ; ++count) {
+        try {
+            unwind_destructor(total_frames);
+        } catchResume (empty_exception *) {
+            // ...
+        }
+    }
+}
Index: doc/theses/andrew_beach_MMath/code/resume-empty.cfa
===================================================================
--- doc/theses/andrew_beach_MMath/code/resume-empty.cfa	(revision ea593a3145f5e63bdf6cbcf2b052c10bc7de6cd5)
+++ doc/theses/andrew_beach_MMath/code/resume-empty.cfa	(revision ea593a3145f5e63bdf6cbcf2b052c10bc7de6cd5)
@@ -0,0 +1,35 @@
+// Resume Across Empty Function
+#include <exception.hfa>
+#include <stdlib.hfa>
+
+EHM_EXCEPTION(empty_exception)();
+
+EHM_VIRTUAL_TABLE(empty_exception, empty_vt);
+
+void unwind_empty(unsigned int frames) {
+	if (frames) {
+
+		unwind_empty(frames - 1);
+	} else {
+		throw (empty_exception){&empty_vt};
+	}
+}
+
+int main(int argc, char * argv[]) {
+	unsigned int times = 1;
+	unsigned int total_frames = 1;
+	if (2 < argc) {
+		times = strtol(argv[1], 0p, 10);
+	}
+	if (3 < argc) {
+		total_frames = strtol(argv[2], 0p, 10);
+	}
+
+	for (int count = 0 ; count < times ; ++count) {
+		try {
+			unwind_empty(total_frames);
+		} catch (empty_exception *) {
+			// ...
+		}
+	}
+}
Index: doc/theses/andrew_beach_MMath/code/resume-finally.cfa
===================================================================
--- doc/theses/andrew_beach_MMath/code/resume-finally.cfa	(revision ea593a3145f5e63bdf6cbcf2b052c10bc7de6cd5)
+++ doc/theses/andrew_beach_MMath/code/resume-finally.cfa	(revision ea593a3145f5e63bdf6cbcf2b052c10bc7de6cd5)
@@ -0,0 +1,38 @@
+// Throw Across Finally
+#include <exception.hfa>
+#include <stdlib.hfa>
+
+EHM_EXCEPTION(empty_exception)();
+
+EHM_VIRTUAL_TABLE(empty_exception, empty_vt);
+
+void unwind_finally(unsigned int frames) {
+	if (frames) {
+		try {
+			unwind_finally(frames - 1);
+		} finally {
+			// ...
+		}
+	} else {
+		throwResume (empty_exception){&empty_vt};
+	}
+}
+
+int main(int argc, char * argv[]) {
+	unsigned int times = 1;
+	unsigned int total_frames = 1;
+	if (2 < argc) {
+		times = strtol(argv[1], 0p, 10);
+	}
+	if (3 < argc) {
+		total_frames = strtol(argv[2], 0p, 10);
+	}
+
+	for (int count = 0 ; count < times ; ++count) {
+		try {
+			unwind_finally(total_frames);
+		} catchResume (empty_exception *) {
+			// ...
+		}
+	}
+}
Index: doc/theses/andrew_beach_MMath/code/resume-other.cfa
===================================================================
--- doc/theses/andrew_beach_MMath/code/resume-other.cfa	(revision ea593a3145f5e63bdf6cbcf2b052c10bc7de6cd5)
+++ doc/theses/andrew_beach_MMath/code/resume-other.cfa	(revision ea593a3145f5e63bdf6cbcf2b052c10bc7de6cd5)
@@ -0,0 +1,40 @@
+// Resume Across Other Handler
+#include <exception.hfa>
+#include <stdlib.hfa>
+
+EHM_EXCEPTION(empty_exception)();
+
+EHM_VIRTUAL_TABLE(empty_exception, empty_vt);
+
+EHM_EXCEPTION(not_raised_exception)();
+
+void unwind_other(unsigned int frames) {
+	if (frames) {
+		try {
+			unwind_other(frames - 1);
+		} catchResume (not_raised_exception *) {
+			// ...
+		}
+	} else {
+		throwResume (empty_exception){&empty_vt};
+	}
+}
+
+int main(int argc, char * argv[]) {
+	unsigned int times = 1;
+	unsigned int total_frames = 1;
+	if (2 < argc) {
+		times = strtol(argv[1], 0p, 10);
+	}
+	if (3 < argc) {
+		total_frames = strtol(argv[2], 0p, 10);
+	}
+
+	for (int count = 0 ; count < times ; ++count) {
+		try {
+			unwind_other(total_frames);
+		} catchResume (empty_exception *) {
+			// ...
+		}
+	}
+}
Index: doc/theses/andrew_beach_MMath/code/throw-detor.cfa
===================================================================
--- doc/theses/andrew_beach_MMath/code/throw-detor.cfa	(revision ea593a3145f5e63bdf6cbcf2b052c10bc7de6cd5)
+++ doc/theses/andrew_beach_MMath/code/throw-detor.cfa	(revision ea593a3145f5e63bdf6cbcf2b052c10bc7de6cd5)
@@ -0,0 +1,41 @@
+// Throw Across Destructor
+#include <exception.hfa>
+#include <stdlib.hfa>
+
+EHM_EXCEPTION(empty_exception)();
+
+EHM_VIRTUAL_TABLE(empty_exception, empty_vt);
+
+struct WithDestructor {};
+
+void ^?{}(WithDestructor & this) {
+	// ...
+}
+
+void unwind_destructor(unsigned int frames) {
+	if (frames) {
+		WithDestructor object;
+		unwind_destructor(frames - 1);
+	} else {
+		throw (empty_exception){&empty_vt};
+	}
+}
+
+int main(int argc, char * argv[]) {
+	unsigned int times = 1;
+	unsigned int total_frames = 1;
+	if (2 < argc) {
+		times = strtol(argv[1], 0p, 10);
+	}
+	if (3 < argc) {
+		total_frames = strtol(argv[2], 0p, 10);
+	}
+
+	for (int count = 0 ; count < times ; ++count) {
+		try {
+			unwind_destructor(total_frames);
+		} catch (empty_exception *) {
+			// ...
+		}
+	}
+}
Index: doc/theses/andrew_beach_MMath/code/throw-detor.cpp
===================================================================
--- doc/theses/andrew_beach_MMath/code/throw-detor.cpp	(revision ea593a3145f5e63bdf6cbcf2b052c10bc7de6cd5)
+++ doc/theses/andrew_beach_MMath/code/throw-detor.cpp	(revision ea593a3145f5e63bdf6cbcf2b052c10bc7de6cd5)
@@ -0,0 +1,37 @@
+// Throw Across Destructor
+#include <exception>
+#include <cstdlib>
+
+struct EmptyException : public std::exception {};
+
+struct WithDestructor {
+	~WithDestructor() {}
+};
+
+void unwind_destructor(unsigned int frames) {
+	if (frames) {
+		WithDestructor object;
+		unwind_destructor(frames - 1);
+	} else {
+		throw (EmptyException){};
+	}
+}
+
+int main(int argc, char * argv[]) {
+	unsigned int times = 1;
+	unsigned int total_frames = 1;
+	if (2 < argc) {
+		times = strtol(argv[1], nullptr, 10);
+	}
+	if (3 < argc) {
+		total_frames = strtol(argv[2], nullptr, 10);
+	}
+
+	for (int count = 0 ; count < times ; ++count) {
+		try {
+			unwind_destructor(total_frames);
+		} catch (EmptyException &) {
+			// ...
+		}
+	}
+}
Index: doc/theses/andrew_beach_MMath/code/throw-empty.cfa
===================================================================
--- doc/theses/andrew_beach_MMath/code/throw-empty.cfa	(revision ea593a3145f5e63bdf6cbcf2b052c10bc7de6cd5)
+++ doc/theses/andrew_beach_MMath/code/throw-empty.cfa	(revision ea593a3145f5e63bdf6cbcf2b052c10bc7de6cd5)
@@ -0,0 +1,34 @@
+// Throw Across Empty Function
+#include <exception.hfa>
+#include <stdlib.hfa>
+
+EHM_EXCEPTION(empty_exception)();
+
+EHM_VIRTUAL_TABLE(empty_exception, empty_vt);
+
+void unwind_empty(unsigned int frames) {
+	if (frames) {
+		unwind_empty(frames - 1);
+	} else {
+		throw (empty_exception){&empty_vt};
+	}
+}
+
+int main(int argc, char * argv[]) {
+	unsigned int times = 1;
+	unsigned int total_frames = 1;
+	if (2 < argc) {
+		times = strtol(argv[1], 0p, 10);
+	}
+	if (3 < argc) {
+		total_frames = strtol(argv[2], 0p, 10);
+	}
+
+	for (unsigned int count = 0 ; count < times ; ++count) {
+		try {
+			unwind_empty(total_frames);
+		} catch (empty_exception *) {
+			// ...
+		}
+	}
+}
Index: doc/theses/andrew_beach_MMath/code/throw-empty.cpp
===================================================================
--- doc/theses/andrew_beach_MMath/code/throw-empty.cpp	(revision ea593a3145f5e63bdf6cbcf2b052c10bc7de6cd5)
+++ doc/theses/andrew_beach_MMath/code/throw-empty.cpp	(revision ea593a3145f5e63bdf6cbcf2b052c10bc7de6cd5)
@@ -0,0 +1,32 @@
+// Throw Across Empty Function
+#include <exception>
+#include <cstdlib>
+
+struct EmptyException : public std::exception {};
+
+void unwind_empty(unsigned int frames) {
+	if (frames) {
+		unwind_empty(frames - 1);
+	} else {
+		throw (EmptyException){};
+	}
+}
+
+int main(int argc, char * argv[]) {
+	unsigned int times = 1;
+	unsigned int total_frames = 1;
+	if (2 < argc) {
+		times = strtol(argv[1], nullptr, 10);
+	}
+	if (3 < argc) {
+		total_frames = strtol(argv[2], nullptr, 10);
+	}
+
+	for (unsigned int count = 0 ; count < times ; ++count) {
+		try {
+			unwind_empty(total_frames);
+		} catch (EmptyException &) {
+			// ...
+		}
+	}
+}
Index: doc/theses/andrew_beach_MMath/code/throw-finally.cfa
===================================================================
--- doc/theses/andrew_beach_MMath/code/throw-finally.cfa	(revision ea593a3145f5e63bdf6cbcf2b052c10bc7de6cd5)
+++ doc/theses/andrew_beach_MMath/code/throw-finally.cfa	(revision ea593a3145f5e63bdf6cbcf2b052c10bc7de6cd5)
@@ -0,0 +1,38 @@
+// Throw Across Finally
+#include <exception.hfa>
+#include <stdlib.hfa>
+
+EHM_EXCEPTION(empty_exception)();
+
+EHM_VIRTUAL_TABLE(empty_exception, empty_vt);
+
+void unwind_finally(unsigned int frames) {
+	if (frames) {
+		try {
+			unwind_finally(frames - 1);
+		} finally {
+			// ...
+		}
+	} else {
+		throw (empty_exception){&empty_vt};
+	}
+}
+
+int main(int argc, char * argv[]) {
+	unsigned int times = 1;
+	unsigned int total_frames = 1;
+	if (2 < argc) {
+		times = strtol(argv[1], 0p, 10);
+	}
+	if (3 < argc) {
+		total_frames = strtol(argv[2], 0p, 10);
+	}
+
+	for (int count = 0 ; count < times ; ++count) {
+		try {
+			unwind_finally(total_frames);
+		} catch (empty_exception *) {
+			// ...
+		}
+	}
+}
Index: doc/theses/andrew_beach_MMath/code/throw-other.cfa
===================================================================
--- doc/theses/andrew_beach_MMath/code/throw-other.cfa	(revision ea593a3145f5e63bdf6cbcf2b052c10bc7de6cd5)
+++ doc/theses/andrew_beach_MMath/code/throw-other.cfa	(revision ea593a3145f5e63bdf6cbcf2b052c10bc7de6cd5)
@@ -0,0 +1,40 @@
+// Throw Across Other Handler
+#include <exception.hfa>
+#include <stdlib.hfa>
+
+EHM_EXCEPTION(empty_exception)();
+
+EHM_VIRTUAL_TABLE(empty_exception, empty_vt);
+
+EHM_EXCEPTION(not_raised_exception)();
+
+void unwind_other(unsigned int frames) {
+	if (frames) {
+		try {
+			unwind_other(frames - 1);
+		} catch (not_raised_exception *) {
+			// ...
+		}
+	} else {
+		throw (empty_exception){&empty_vt};
+	}
+}
+
+int main(int argc, char * argv[]) {
+	unsigned int times = 1;
+	unsigned int total_frames = 1;
+	if (2 < argc) {
+		times = strtol(argv[1], 0p, 10);
+	}
+	if (3 < argc) {
+		total_frames = strtol(argv[2], 0p, 10);
+	}
+
+	for (int count = 0 ; count < times ; ++count) {
+		try {
+			unwind_other(total_frames);
+		} catch (empty_exception *) {
+			// ...
+		}
+	}
+}
Index: doc/theses/andrew_beach_MMath/code/throw-other.cpp
===================================================================
--- doc/theses/andrew_beach_MMath/code/throw-other.cpp	(revision ea593a3145f5e63bdf6cbcf2b052c10bc7de6cd5)
+++ doc/theses/andrew_beach_MMath/code/throw-other.cpp	(revision ea593a3145f5e63bdf6cbcf2b052c10bc7de6cd5)
@@ -0,0 +1,38 @@
+// Throw Across Other Handler
+#include <exception>
+#include <cstdlib>
+
+struct EmptyException : public std::exception {};
+
+struct NotRaisedException {};
+
+void unwind_other(unsigned int frames) {
+	if (frames) {
+		try {
+			unwind_other(frames - 1);
+		} catch (NotRaisedException &) {
+			// ...
+		}
+	} else {
+		throw (EmptyException){};
+	}
+}
+
+int main(int argc, char * argv[]) {
+	unsigned int times = 1;
+	unsigned int total_frames = 1;
+	if (2 < argc) {
+		times = strtol(argv[1], nullptr, 10);
+	}
+	if (3 < argc) {
+		total_frames = strtol(argv[2], nullptr, 10);
+	}
+
+	for (int count = 0 ; count < times ; ++count) {
+		try {
+			unwind_other(total_frames);
+		} catch (EmptyException &) {
+			// ...
+		}
+	}
+}
