Index: doc/theses/andrew_beach_MMath/code/CondMatch.java
===================================================================
--- doc/theses/andrew_beach_MMath/code/CondMatch.java	(revision 943bfad2c0b8d6d35a71ff04892a3d14825e9dc8)
+++ doc/theses/andrew_beach_MMath/code/CondMatch.java	(revision 943bfad2c0b8d6d35a71ff04892a3d14825e9dc8)
@@ -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 943bfad2c0b8d6d35a71ff04892a3d14825e9dc8)
+++ doc/theses/andrew_beach_MMath/code/CrossCatch.java	(revision 943bfad2c0b8d6d35a71ff04892a3d14825e9dc8)
@@ -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 943bfad2c0b8d6d35a71ff04892a3d14825e9dc8)
+++ doc/theses/andrew_beach_MMath/code/CrossFinally.java	(revision 943bfad2c0b8d6d35a71ff04892a3d14825e9dc8)
@@ -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 943bfad2c0b8d6d35a71ff04892a3d14825e9dc8)
+++ doc/theses/andrew_beach_MMath/code/ThrowEmpty.java	(revision 943bfad2c0b8d6d35a71ff04892a3d14825e9dc8)
@@ -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 943bfad2c0b8d6d35a71ff04892a3d14825e9dc8)
+++ doc/theses/andrew_beach_MMath/code/ThrowFinally.java	(revision 943bfad2c0b8d6d35a71ff04892a3d14825e9dc8)
@@ -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 943bfad2c0b8d6d35a71ff04892a3d14825e9dc8)
+++ doc/theses/andrew_beach_MMath/code/ThrowOther.java	(revision 943bfad2c0b8d6d35a71ff04892a3d14825e9dc8)
@@ -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 943bfad2c0b8d6d35a71ff04892a3d14825e9dc8)
+++ doc/theses/andrew_beach_MMath/code/cond-match-r.cfa	(revision 943bfad2c0b8d6d35a71ff04892a3d14825e9dc8)
@@ -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 943bfad2c0b8d6d35a71ff04892a3d14825e9dc8)
+++ doc/theses/andrew_beach_MMath/code/cond-match.cfa	(revision 943bfad2c0b8d6d35a71ff04892a3d14825e9dc8)
@@ -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 943bfad2c0b8d6d35a71ff04892a3d14825e9dc8)
+++ doc/theses/andrew_beach_MMath/code/cond-match.cpp	(revision 943bfad2c0b8d6d35a71ff04892a3d14825e9dc8)
@@ -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 943bfad2c0b8d6d35a71ff04892a3d14825e9dc8)
+++ doc/theses/andrew_beach_MMath/code/cross-catch.cfa	(revision 943bfad2c0b8d6d35a71ff04892a3d14825e9dc8)
@@ -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 943bfad2c0b8d6d35a71ff04892a3d14825e9dc8)
+++ doc/theses/andrew_beach_MMath/code/cross-catch.cpp	(revision 943bfad2c0b8d6d35a71ff04892a3d14825e9dc8)
@@ -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 943bfad2c0b8d6d35a71ff04892a3d14825e9dc8)
+++ doc/theses/andrew_beach_MMath/code/cross-finally.cfa	(revision 943bfad2c0b8d6d35a71ff04892a3d14825e9dc8)
@@ -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 943bfad2c0b8d6d35a71ff04892a3d14825e9dc8)
+++ doc/theses/andrew_beach_MMath/code/cross-resume.cfa	(revision 943bfad2c0b8d6d35a71ff04892a3d14825e9dc8)
@@ -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 943bfad2c0b8d6d35a71ff04892a3d14825e9dc8)
+++ doc/theses/andrew_beach_MMath/code/resume-detor.cfa	(revision 943bfad2c0b8d6d35a71ff04892a3d14825e9dc8)
@@ -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 943bfad2c0b8d6d35a71ff04892a3d14825e9dc8)
+++ doc/theses/andrew_beach_MMath/code/resume-empty.cfa	(revision 943bfad2c0b8d6d35a71ff04892a3d14825e9dc8)
@@ -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 943bfad2c0b8d6d35a71ff04892a3d14825e9dc8)
+++ doc/theses/andrew_beach_MMath/code/resume-finally.cfa	(revision 943bfad2c0b8d6d35a71ff04892a3d14825e9dc8)
@@ -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 943bfad2c0b8d6d35a71ff04892a3d14825e9dc8)
+++ doc/theses/andrew_beach_MMath/code/resume-other.cfa	(revision 943bfad2c0b8d6d35a71ff04892a3d14825e9dc8)
@@ -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 943bfad2c0b8d6d35a71ff04892a3d14825e9dc8)
+++ doc/theses/andrew_beach_MMath/code/throw-detor.cfa	(revision 943bfad2c0b8d6d35a71ff04892a3d14825e9dc8)
@@ -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 943bfad2c0b8d6d35a71ff04892a3d14825e9dc8)
+++ doc/theses/andrew_beach_MMath/code/throw-detor.cpp	(revision 943bfad2c0b8d6d35a71ff04892a3d14825e9dc8)
@@ -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 943bfad2c0b8d6d35a71ff04892a3d14825e9dc8)
+++ doc/theses/andrew_beach_MMath/code/throw-empty.cfa	(revision 943bfad2c0b8d6d35a71ff04892a3d14825e9dc8)
@@ -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 943bfad2c0b8d6d35a71ff04892a3d14825e9dc8)
+++ doc/theses/andrew_beach_MMath/code/throw-empty.cpp	(revision 943bfad2c0b8d6d35a71ff04892a3d14825e9dc8)
@@ -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 943bfad2c0b8d6d35a71ff04892a3d14825e9dc8)
+++ doc/theses/andrew_beach_MMath/code/throw-finally.cfa	(revision 943bfad2c0b8d6d35a71ff04892a3d14825e9dc8)
@@ -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 943bfad2c0b8d6d35a71ff04892a3d14825e9dc8)
+++ doc/theses/andrew_beach_MMath/code/throw-other.cfa	(revision 943bfad2c0b8d6d35a71ff04892a3d14825e9dc8)
@@ -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 943bfad2c0b8d6d35a71ff04892a3d14825e9dc8)
+++ doc/theses/andrew_beach_MMath/code/throw-other.cpp	(revision 943bfad2c0b8d6d35a71ff04892a3d14825e9dc8)
@@ -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 &) {
+			// ...
+		}
+	}
+}
Index: doc/theses/andrew_beach_MMath/performance.tex
===================================================================
--- doc/theses/andrew_beach_MMath/performance.tex	(revision d02e5477434998e31a961919e0ef524fa9a3761a)
+++ doc/theses/andrew_beach_MMath/performance.tex	(revision 943bfad2c0b8d6d35a71ff04892a3d14825e9dc8)
@@ -4,6 +4,4 @@
 \textbf{Just because of the stage of testing there are design notes for
 the tests as well as commentary on them.}
-\todo{Revisit organization of the performance chapter once tests are chosen.}
-% What are good tests for resumption?
 
 Performance has been of secondary importance for most of this project.
@@ -12,5 +10,4 @@
 amount of time.
 
-%\section{Termination Comparison}
 \section{Test Set-Up}
 Tests will be run on \CFA, C++ and Java.
@@ -51,49 +48,58 @@
 The should provide a guide as to where the EHM's costs can be found.
 
-\paragraph{Raise/Handle}
-What is the basic cost to raise and handle an exception?
+Tests are run in \CFA, \Cpp and Java.
+Not every test is run in every language, if the feature under test is missing
+the test is skipped. These cases will be noted.
+In addition to the termination tests for every language,
+\CFA has a second set of tests that test resumption. These are the same
+except that the raise statements and handler clauses are replaced with the
+resumption variants.
 
-There are a number of factors that can effect this.
-For \CFA this includes the type of raise,
+\paragraph{Raise and Handle}
+The first group of tests involve setting up
+So there is three layers to the test. The first is set up and a loop, which
+configures the test and then runs it repeatedly to reduce the impact of
+start-up and shutdown on the results.
+Each iteration of the main loop
+\begin{itemize}
+\item Empty Function:
+The repeating function is empty except for the necessary control code.
+\item Destructor:
+The repeating function creates an object with a destructor before calling
+itself.
+(Java is skipped as it does not destructors.)
+\item Finally:
+The repeating function calls itself inside a try block with a finally clause
+attached.
+(\Cpp is skipped as it does not have finally clauses.)
+\item Other Handler:
+The repeating function calls itself inside a try block with a handler that
+will not match the raised exception. (But is of the same kind of handler.)
+\end{itemize}
 
-Main loop, pass through a catch-all, call through some empty helper functions
-to put frames on the stack then raise and exception.
-\todo{Raise/Handle (or a similar test) could also test how much it costs to
-search over things, not sure if that is a useful test.}
+\paragraph{Cross Try Statement}
+The next group measures the cost of a try statement when no exceptions are
+raised. The test is set-up, then there is a loop to reduce the impact of
+start-up and shutdown on the results.
+In each iteration, a try statement is executed. Entering and leaving a loop
+is all the test wants to do.
+\begin{itemize}
+\item Handler:
+The try statement has a handler (of the matching kind).
+\item Finally:
+The try statement has a finally clause.
+\end{itemize}
 
-\paragraph{Unwinding}
-Isolating the unwinding of the stack as much as possible.
-
-This has the same set-up as the raise/handle test except the intermediate
-stack frames contain either an object declaration with a destructor or a
-try statement with no handlers except for a finally clause.
-
-\paragraph{Enter/Leave}
-What is the cost of entering and leaving a try block, even if no exception
-is thrown?
-
-This test is a simple pattern of entering
-and leaving a try statement.
-
-The only tunables here are which clauses are attached to the try block:
-termination handlers, resumption handlers and finally clauses.
-
-\paragraph{Re-throw and Conditional-Catch}
-How expensive it is to run a non-exception type check for a handler?
-
-In this case different languages approach this problem differently, either
-through a re-throw or a conditional-catch.
-Where \CFA uses its condition other languages will have to unconditionally
-catch the exception then re-throw if the condition if the condition is false.
-
-The set up is as follows: main loop, a catch-all exception handler,
-a conditional catch and then the raise.
-
-% We could do a Cforall test without the catch all and a new default handler
-% that does a catch all.
-As a point of comparison one of the raise/handle tests (which one?) has
-same layout but never catches anything.
-
-The main tunable in this test is how often the conditional-catch matches.
+\paragraph{Conditional Matching}
+This group of tests checks the cost of conditional matching.
+Only \CFA implements the language level conditional match,
+the other languages must mimic with an ``unconditional" match (it still
+checks the exception's type) and conditional re-raise.
+\begin{itemize}
+\item Catch All:
+The condition is always true. (Always matches or never re-raises.)
+\item Catch None:
+The condition is always false. (Never matches or always re-raises.)
+\end{itemize}
 
 %\section{Cost in Size}
