Index: doc/theses/andrew_beach_MMath/code/FixupEmpty.java
===================================================================
--- doc/theses/andrew_beach_MMath/code/FixupEmpty.java	(revision 180f249d8c08c772b9b9314d1b36dd26f03cd3cb)
+++ doc/theses/andrew_beach_MMath/code/FixupEmpty.java	(revision 180f249d8c08c772b9b9314d1b36dd26f03cd3cb)
@@ -0,0 +1,42 @@
+public class FixupEmpty {
+	public interface Fixup {
+		public int op(int fixup);
+	}
+
+	static void nounwind_fixup(int frames, Fixup raised_rtn) {
+		if (0 < frames) {
+			nounwind_fixup(frames - 1, raised_rtn);
+		} else {
+			int fixup = frames;
+			fixup = raised_rtn.op(fixup);
+		}
+	}
+
+	private static long loop(int times, int total_frames) {
+		Fixup raised = (int fixup) -> total_frames + 42; // use local scope => lexical link
+
+		long startTime = System.nanoTime();
+		for (int count = 0 ; count < times ; ++count) {
+			nounwind_fixup(total_frames, raised);
+		}
+		long endTime = System.nanoTime();
+		return endTime - startTime;
+	}
+
+	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]);
+		}
+
+		// Warm-Up:
+		loop(1000, total_frames);
+
+		long time = loop(times, total_frames);
+		System.out.format("Run-Time (s): %.1f%n", time / 1_000_000_000.);
+	}
+}
Index: doc/theses/andrew_beach_MMath/code/FixupOther.java
===================================================================
--- doc/theses/andrew_beach_MMath/code/FixupOther.java	(revision 180f249d8c08c772b9b9314d1b36dd26f03cd3cb)
+++ doc/theses/andrew_beach_MMath/code/FixupOther.java	(revision 180f249d8c08c772b9b9314d1b36dd26f03cd3cb)
@@ -0,0 +1,44 @@
+public class FixupOther {
+	public interface Fixup {
+		public int op(int fixup);
+	}
+
+	static void nounwind_fixup(int frames, Fixup raised_rtn, Fixup not_raised_rtn) {
+	 	Fixup not_raised = (int fixup) -> frames + 42; // use local scope => lexical link
+		if (0 < frames) {
+			nounwind_fixup(frames - 1, raised_rtn, not_raised);
+		} else {
+			int fixup = 17;
+			fixup = raised_rtn.op(fixup);
+		}
+	}
+
+	private static long loop(int times, int total_frames) {
+		Fixup raised = (int fixup) -> total_frames + 42; // use local scope => lexical link
+		Fixup not_raised = (int fixup) -> total_frames + 42; // use local scope => lexical link
+
+		long startTime = System.nanoTime();
+		for (int count = 0 ; count < times ; ++count) {
+		    nounwind_fixup(total_frames, raised, not_raised);
+		}
+		long endTime = System.nanoTime();
+		return endTime - startTime;
+	}
+
+	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]);
+		}
+
+		// Warm-Up:
+		loop(1000, total_frames);
+
+		long time = loop(times, total_frames);
+		System.out.format("Run-Time (s): %.1f%n", time / 1_000_000_000.);
+	}
+}
Index: c/theses/andrew_beach_MMath/code/ResumeFixupEmpty.java
===================================================================
--- doc/theses/andrew_beach_MMath/code/ResumeFixupEmpty.java	(revision 65502d83df1b51d0a863dcb592705be3ca7b3c58)
+++ 	(revision )
@@ -1,42 +1,0 @@
-public class ResumeFixupEmpty {
-	public interface Fixup {
-		public int op(int fixup);
-	}
-
-	static void nounwind_fixup(int frames, Fixup raised_rtn) {
-		if (0 < frames) {
-			nounwind_fixup(frames - 1, raised_rtn);
-		} else {
-			int fixup = frames;
-			fixup = raised_rtn.op(fixup);
-		}
-	}
-
-	private static long loop(int times, int total_frames) {
-		Fixup raised = (int fixup) -> total_frames + 42; // use local scope => lexical link
-
-		long startTime = System.nanoTime();
-		for (int count = 0 ; count < times ; ++count) {
-			nounwind_fixup(total_frames, raised);
-		}
-		long endTime = System.nanoTime();
-		return endTime - startTime;
-	}
-
-	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]);
-		}
-
-		// Warm-Up:
-		loop(1000, total_frames);
-
-		long time = loop(times, total_frames);
-		System.out.format("Run-Time (s): %.1f%n", time / 1_000_000_000.);
-	}
-}
Index: c/theses/andrew_beach_MMath/code/ResumeFixupOther.java
===================================================================
--- doc/theses/andrew_beach_MMath/code/ResumeFixupOther.java	(revision 65502d83df1b51d0a863dcb592705be3ca7b3c58)
+++ 	(revision )
@@ -1,44 +1,0 @@
-public class ResumeFixupOther {
-	public interface Fixup {
-		public int op(int fixup);
-	}
-
-	static void nounwind_fixup(int frames, Fixup raised_rtn, Fixup not_raised_rtn) {
-	 	Fixup not_raised = (int fixup) -> frames + 42; // use local scope => lexical link
-		if (0 < frames) {
-			nounwind_fixup(frames - 1, raised_rtn, not_raised);
-		} else {
-			int fixup = 17;
-			fixup = raised_rtn.op(fixup);
-		}
-	}
-
-	private static long loop(int times, int total_frames) {
-		Fixup raised = (int fixup) -> total_frames + 42; // use local scope => lexical link
-		Fixup not_raised = (int fixup) -> total_frames + 42; // use local scope => lexical link
-
-		long startTime = System.nanoTime();
-		for (int count = 0 ; count < times ; ++count) {
-		    nounwind_fixup(total_frames, raised, not_raised);
-		}
-		long endTime = System.nanoTime();
-		return endTime - startTime;
-	}
-
-	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]);
-		}
-
-		// Warm-Up:
-		loop(1000, total_frames);
-
-		long time = loop(times, total_frames);
-		System.out.format("Run-Time (s): %.1f%n", time / 1_000_000_000.);
-	}
-}
Index: doc/theses/andrew_beach_MMath/code/cond-catch.py
===================================================================
--- doc/theses/andrew_beach_MMath/code/cond-catch.py	(revision 65502d83df1b51d0a863dcb592705be3ca7b3c58)
+++ doc/theses/andrew_beach_MMath/code/cond-catch.py	(revision 180f249d8c08c772b9b9314d1b36dd26f03cd3cb)
@@ -32,5 +32,5 @@
 
     end_time = thread_time_ns()
-    print('Run-Time (s) {:.1f}:'.format((end_time - start_time) / 1_000_000_000.))
+    print('Run-Time (s): {:.1f}'.format((end_time - start_time) / 1_000_000_000.))
 
 
Index: doc/theses/andrew_beach_MMath/code/fixup-empty-f.cfa
===================================================================
--- doc/theses/andrew_beach_MMath/code/fixup-empty-f.cfa	(revision 180f249d8c08c772b9b9314d1b36dd26f03cd3cb)
+++ doc/theses/andrew_beach_MMath/code/fixup-empty-f.cfa	(revision 180f249d8c08c772b9b9314d1b36dd26f03cd3cb)
@@ -0,0 +1,40 @@
+// Resume Across Fixup
+#include <clock.hfa>
+#include <fstream.hfa>
+#include <stdlib.hfa>									// strto
+
+int nounwind_fixup(unsigned int frames, void (*raised_rtn)(int &)) {
+	if (frames) {
+		int rtn = nounwind_fixup(frames - 1, raised_rtn);
+		if ( rtn == 42 ) printf( "42" );				// make non-tail recursive
+		return rtn;
+
+	} else {
+		int fixup = 17;
+		raised_rtn(fixup);
+		return fixup;
+	}
+}
+
+int main(int argc, char * argv[]) {
+	unsigned int times = 1;
+	unsigned int total_frames = 1;
+	if (1 < argc) {
+		times = strto(argv[1], 0p, 10);
+	}
+	if (2 < argc) {
+		total_frames = strto(argv[2], 0p, 10);
+	}
+
+	void raised(int & fixup) {
+		fixup = total_frames + 42;						// use local scope => lexical link
+		if ( total_frames == 42 ) printf( "42" );
+	}
+
+	Time start_time = timeHiRes();
+	for (unsigned int count = 0 ; count < times ; ++count) {
+		nounwind_fixup(total_frames, raised);
+	}
+	Time end_time = timeHiRes();
+	sout | "Run-Time (s): " | wd(0,1, (end_time - start_time)`ns / 1_000_000_000.);
+}
Index: doc/theses/andrew_beach_MMath/code/fixup-empty-r.cfa
===================================================================
--- doc/theses/andrew_beach_MMath/code/fixup-empty-r.cfa	(revision 180f249d8c08c772b9b9314d1b36dd26f03cd3cb)
+++ doc/theses/andrew_beach_MMath/code/fixup-empty-r.cfa	(revision 180f249d8c08c772b9b9314d1b36dd26f03cd3cb)
@@ -0,0 +1,44 @@
+// Resume Across Empty Function
+#include <clock.hfa>
+#include <exception.hfa>
+#include <fstream.hfa>
+#include <stdlib.hfa>									// strto
+
+exception fixup_exception {
+	int & fixup;
+};
+vtable(fixup_exception) fixup_vt;
+
+int nounwind_empty(unsigned int frames) {
+	if (frames) {
+		int rtn = nounwind_empty(frames - 1);
+		if ( rtn == 42 ) printf( "42" );				// make non-tail recursive
+		return rtn;
+	} else {
+		int fixup = 17;
+		throwResume (fixup_exception){&fixup_vt, fixup}; // change bad fixup
+		return fixup;
+	}
+}
+
+int main(int argc, char * argv[]) {
+	unsigned int times = 1;
+	unsigned int total_frames = 1;
+	if (1 < argc) {
+		times = strto(argv[1], 0p, 10);
+	}
+	if (2 < argc) {
+		total_frames = strto(argv[2], 0p, 10);
+	}
+
+	Time start_time = timeHiRes();
+	for (unsigned int count = 0 ; count < times ; ++count) {
+		try {
+			nounwind_empty(total_frames);
+		} catchResume (fixup_exception * ex) {
+			ex->fixup = total_frames + 42;
+		}
+	}
+	Time end_time = timeHiRes();
+	sout | "Run-Time (s): " | wd(0,1, (end_time - start_time)`ns / 1_000_000_000.);
+}
Index: doc/theses/andrew_beach_MMath/code/fixup-empty.cpp
===================================================================
--- doc/theses/andrew_beach_MMath/code/fixup-empty.cpp	(revision 180f249d8c08c772b9b9314d1b36dd26f03cd3cb)
+++ doc/theses/andrew_beach_MMath/code/fixup-empty.cpp	(revision 180f249d8c08c772b9b9314d1b36dd26f03cd3cb)
@@ -0,0 +1,41 @@
+// Resume Across Fixup
+#include <chrono>
+#include <cstdlib>
+#include <exception>
+#include <iostream>
+#include <iomanip>
+#include <functional>
+
+using namespace std;
+using namespace chrono;
+
+void nounwind_fixup(unsigned int frames, function<void (int &)> raised_rtn ) {
+	if (frames) {
+		nounwind_fixup(frames - 1, raised_rtn);
+	} else {
+		int fixup = 17;
+		raised_rtn(fixup);
+	}
+}
+
+int main(int argc, char * argv[]) {
+	unsigned int times = 1;
+	unsigned int total_frames = 1;
+	if (1 < argc) {
+		times = strtol(argv[1], nullptr, 10);
+	}
+	if (2 < argc) {
+		total_frames = strtol(argv[2], nullptr, 10);
+	}
+
+	auto raised = [=] (int & fixup) -> void {
+					  fixup = total_frames + 42;		// use local scope => lexical link
+				  };
+	time_point<steady_clock> start_time = steady_clock::now();
+	for (unsigned int count = 0 ; count < times ; ++count) {
+		nounwind_fixup(total_frames, raised);
+	}
+	time_point<steady_clock> end_time = steady_clock::now();
+	nanoseconds duration = duration_cast<nanoseconds>(end_time - start_time);
+	cout << "Run-Time (s): " << fixed << setprecision(1) << duration.count() / 1'000'000'000. << endl;
+}
Index: doc/theses/andrew_beach_MMath/code/fixup-empty.py
===================================================================
--- doc/theses/andrew_beach_MMath/code/fixup-empty.py	(revision 180f249d8c08c772b9b9314d1b36dd26f03cd3cb)
+++ doc/theses/andrew_beach_MMath/code/fixup-empty.py	(revision 180f249d8c08c772b9b9314d1b36dd26f03cd3cb)
@@ -0,0 +1,32 @@
+#!/usr/bin/env python3
+
+from time import thread_time_ns
+
+def nounwind_fixup(frames, raised_rtn):
+    if 0 < frames:
+        nounwind_fixup(frames - 1, raised_rtn)
+    else:
+        fixup = 17;
+        raised_rtn(fixup);
+
+
+def main(argv):
+    times = 1
+    total_frames = 1
+    if 1 < len(argv):
+        times = int(argv[1])
+    if 2 < len(argv):
+        total_frames = int(argv[2])
+
+    raised = lambda lfixup : total_frames + 42		# use local scope => lexical link
+    start_time = thread_time_ns()
+    for count in range(times):
+        nounwind_fixup(total_frames, raised)
+
+    end_time = thread_time_ns()
+    print('Run-Time (s): {:.1f}'.format((end_time - start_time) / 1_000_000_000.))
+
+
+if '__main__' == __name__:
+    import sys
+    main(sys.argv)
Index: doc/theses/andrew_beach_MMath/code/fixup-other-f.cfa
===================================================================
--- doc/theses/andrew_beach_MMath/code/fixup-other-f.cfa	(revision 180f249d8c08c772b9b9314d1b36dd26f03cd3cb)
+++ doc/theses/andrew_beach_MMath/code/fixup-other-f.cfa	(revision 180f249d8c08c772b9b9314d1b36dd26f03cd3cb)
@@ -0,0 +1,46 @@
+// Resume Across Fixup
+#include <clock.hfa>
+#include <fstream.hfa>
+#include <stdlib.hfa>									// strto
+
+unsigned int frames;									// use global because of gcc thunk problem
+
+void nounwind_fixup(unsigned int dummy, void (*raised_rtn)(int &), void (*not_raised_rtn)(int &)) {
+	void not_raised(int & fixup) {
+		fixup = frames + 42;							// use local scope => lexical link
+	}
+
+	if (frames) {
+		frames -= 1;
+		nounwind_fixup(42, raised_rtn, not_raised);
+	} else {
+		int fixup = dummy;
+		raised_rtn(fixup);
+	}
+}
+
+int main(int argc, char * argv[]) {
+	unsigned int times = 1;
+	unsigned int total_frames = 1;
+	if (1 < argc) {
+		times = strto(argv[1], 0p, 10);
+	}
+	if (2 < argc) {
+		total_frames = strto(argv[2], 0p, 10);
+	}
+	frames = total_frames;
+
+	void raised(int & fixup) {
+		fixup = total_frames + 42;						// use local scope => lexical link
+	}
+	void not_raised(int & fixup) {
+		fixup = total_frames + 42;						// use local scope => lexical link
+	}
+
+	Time start_time = timeHiRes();
+	for (int count = 0 ; count < times ; ++count) {
+		nounwind_fixup(42, raised, not_raised);
+	}
+	Time end_time = timeHiRes();
+	sout | "Run-Time (s): " | wd(0,1, (end_time - start_time)`ns / 1_000_000_000.);
+}
Index: doc/theses/andrew_beach_MMath/code/fixup-other-r.cfa
===================================================================
--- doc/theses/andrew_beach_MMath/code/fixup-other-r.cfa	(revision 180f249d8c08c772b9b9314d1b36dd26f03cd3cb)
+++ doc/theses/andrew_beach_MMath/code/fixup-other-r.cfa	(revision 180f249d8c08c772b9b9314d1b36dd26f03cd3cb)
@@ -0,0 +1,52 @@
+// Resume Across Other Handler
+#include <clock.hfa>
+#include <exception.hfa>
+#include <fstream.hfa>
+#include <stdlib.hfa>									// strto
+
+exception fixup_exception {
+	int & fixup;
+};
+vtable(fixup_exception) fixup_vt;
+exception not_raised_exception {
+	int & fixup;
+};
+
+unsigned int frames;									// use global because of gcc thunk problem
+
+void nounwind_other(unsigned int dummy) {
+	if (frames) {
+		frames -= 1;
+		try {
+			nounwind_other(42);
+		} catchResume (not_raised_exception * ex) {
+			ex->fixup = frames + 42;					// use local scope => lexical link
+		}
+	} else {
+		int fixup = dummy;
+		throwResume (fixup_exception){&fixup_vt, fixup}; // change bad fixup
+	}
+}
+
+int main(int argc, char * argv[]) {
+	unsigned int times = 1;
+	unsigned int total_frames = 1;
+	if (1 < argc) {
+		times = strto(argv[1], 0p, 10);
+	}
+	if (2 < argc) {
+		total_frames = strto(argv[2], 0p, 10);
+	}
+	frames = total_frames;
+
+	Time start_time = timeHiRes();
+	for (int count = 0 ; count < times ; ++count) {
+		try {
+			nounwind_other(42);
+		} catchResume (fixup_exception * ex) {
+			ex->fixup = total_frames + 42;
+		}
+	}
+	Time end_time = timeHiRes();
+	sout | "Run-Time (s): " | wd(0,1, (end_time - start_time)`ns / 1_000_000_000.);
+}
Index: doc/theses/andrew_beach_MMath/code/fixup-other.cpp
===================================================================
--- doc/theses/andrew_beach_MMath/code/fixup-other.cpp	(revision 180f249d8c08c772b9b9314d1b36dd26f03cd3cb)
+++ doc/theses/andrew_beach_MMath/code/fixup-other.cpp	(revision 180f249d8c08c772b9b9314d1b36dd26f03cd3cb)
@@ -0,0 +1,49 @@
+// Resume Across Fixup
+#include <chrono>
+#include <cstdlib>
+#include <exception>
+#include <iostream>
+#include <iomanip>
+#include <functional>
+
+using namespace std;
+using namespace chrono;
+
+void nounwind_fixup(unsigned int frames, function<void (int &)> raised_rtn, function<void (int &)> not_raised_rtn ) {
+	auto not_raised = [=](int & fixup) -> void {
+						  fixup = frames + 42;			// use local scope => lexical link
+					  };
+
+	if (frames) {
+		nounwind_fixup(frames - 1, raised_rtn, not_raised);
+	} else {
+		int fixup = 17;
+		raised_rtn(fixup);
+	}
+}
+
+int main(int argc, char * argv[]) {
+	unsigned int times = 1;
+	unsigned int total_frames = 1;
+	if (1 < argc) {
+		times = strtol(argv[1], nullptr, 10);
+	}
+	if (2 < argc) {
+		total_frames = strtol(argv[2], nullptr, 10);
+	}
+
+	auto raised = [=] (int & fixup) -> void {
+					  fixup = total_frames + 42;		// use local scope => lexical link
+				  };
+	auto not_raised = [=] (int & fixup) -> void {
+						  fixup = total_frames + 42;	// use local scope => lexical link
+					  };
+
+	time_point<steady_clock> start_time = steady_clock::now();
+	for (unsigned int count = 0 ; count < times ; ++count) {
+		nounwind_fixup(total_frames, raised, not_raised);
+	}
+	time_point<steady_clock> end_time = steady_clock::now();
+	nanoseconds duration = duration_cast<nanoseconds>(end_time - start_time);
+	cout << "Run-Time (s): " << fixed << setprecision(1) << duration.count() / 1'000'000'000. << endl;
+}
Index: doc/theses/andrew_beach_MMath/code/fixup-other.py
===================================================================
--- doc/theses/andrew_beach_MMath/code/fixup-other.py	(revision 180f249d8c08c772b9b9314d1b36dd26f03cd3cb)
+++ doc/theses/andrew_beach_MMath/code/fixup-other.py	(revision 180f249d8c08c772b9b9314d1b36dd26f03cd3cb)
@@ -0,0 +1,34 @@
+#!/usr/bin/env python3
+
+from time import thread_time_ns
+
+def nounwind_fixup(frames, raised_rtn, not_raised_rtn):
+    not_raised = lambda lfixup : frames + 42		# use local scope => lexical link
+    if 0 < frames:
+        nounwind_fixup(frames - 1, raised_rtn, not_raised)
+    else:
+        fixup = 17;
+        raised_rtn(fixup);
+
+
+def main(argv):
+    times = 1
+    total_frames = 1
+    if 1 < len(argv):
+        times = int(argv[1])
+    if 2 < len(argv):
+        total_frames = int(argv[2])
+
+    raised = lambda lfixup : total_frames + 42		# use local scope => lexical link
+    not_raised = lambda lfixup : total_frames + 42	# use local scope => lexical link
+    start_time = thread_time_ns()
+    for count in range(times):
+        nounwind_fixup(total_frames, raised, not_raised)
+
+    end_time = thread_time_ns()
+    print('Run-Time (s): {:.1f}'.format((end_time - start_time) / 1_000_000_000.))
+
+
+if '__main__' == __name__:
+    import sys
+    main(sys.argv)
Index: c/theses/andrew_beach_MMath/code/resume-fixup-empty-f.cfa
===================================================================
--- doc/theses/andrew_beach_MMath/code/resume-fixup-empty-f.cfa	(revision 65502d83df1b51d0a863dcb592705be3ca7b3c58)
+++ 	(revision )
@@ -1,40 +1,0 @@
-// Resume Across Fixup
-#include <clock.hfa>
-#include <fstream.hfa>
-#include <stdlib.hfa>									// strto
-
-int nounwind_fixup(unsigned int frames, void (*raised_rtn)(int &)) {
-	if (frames) {
-		int rtn = nounwind_fixup(frames - 1, raised_rtn);
-		if ( rtn == 42 ) printf( "42" );				// make non-tail recursive
-		return rtn;
-
-	} else {
-		int fixup = 17;
-		raised_rtn(fixup);
-		return fixup;
-	}
-}
-
-int main(int argc, char * argv[]) {
-	unsigned int times = 1;
-	unsigned int total_frames = 1;
-	if (1 < argc) {
-		times = strto(argv[1], 0p, 10);
-	}
-	if (2 < argc) {
-		total_frames = strto(argv[2], 0p, 10);
-	}
-
-	void raised(int & fixup) {
-		fixup = total_frames + 42;						// use local scope => lexical link
-		if ( total_frames == 42 ) printf( "42" );
-	}
-
-	Time start_time = timeHiRes();
-	for (unsigned int count = 0 ; count < times ; ++count) {
-		nounwind_fixup(total_frames, raised);
-	}
-	Time end_time = timeHiRes();
-	sout | "Run-Time (s): " | wd(0,1, (end_time - start_time)`ns / 1_000_000_000.);
-}
Index: c/theses/andrew_beach_MMath/code/resume-fixup-empty-r.cfa
===================================================================
--- doc/theses/andrew_beach_MMath/code/resume-fixup-empty-r.cfa	(revision 65502d83df1b51d0a863dcb592705be3ca7b3c58)
+++ 	(revision )
@@ -1,44 +1,0 @@
-// Resume Across Empty Function
-#include <clock.hfa>
-#include <exception.hfa>
-#include <fstream.hfa>
-#include <stdlib.hfa>									// strto
-
-exception fixup_exception {
-	int & fixup;
-};
-vtable(fixup_exception) fixup_vt;
-
-int nounwind_empty(unsigned int frames) {
-	if (frames) {
-		int rtn = nounwind_empty(frames - 1);
-		if ( rtn == 42 ) printf( "42" );				// make non-tail recursive
-		return rtn;
-	} else {
-		int fixup = 17;
-		throwResume (fixup_exception){&fixup_vt, fixup}; // change bad fixup
-		return fixup;
-	}
-}
-
-int main(int argc, char * argv[]) {
-	unsigned int times = 1;
-	unsigned int total_frames = 1;
-	if (1 < argc) {
-		times = strto(argv[1], 0p, 10);
-	}
-	if (2 < argc) {
-		total_frames = strto(argv[2], 0p, 10);
-	}
-
-	Time start_time = timeHiRes();
-	for (unsigned int count = 0 ; count < times ; ++count) {
-		try {
-			nounwind_empty(total_frames);
-		} catchResume (fixup_exception * ex) {
-			ex->fixup = total_frames + 42;
-		}
-	}
-	Time end_time = timeHiRes();
-	sout | "Run-Time (s): " | wd(0,1, (end_time - start_time)`ns / 1_000_000_000.);
-}
Index: c/theses/andrew_beach_MMath/code/resume-fixup-empty.cpp
===================================================================
--- doc/theses/andrew_beach_MMath/code/resume-fixup-empty.cpp	(revision 65502d83df1b51d0a863dcb592705be3ca7b3c58)
+++ 	(revision )
@@ -1,41 +1,0 @@
-// Resume Across Fixup
-#include <chrono>
-#include <cstdlib>
-#include <exception>
-#include <iostream>
-#include <iomanip>
-#include <functional>
-
-using namespace std;
-using namespace chrono;
-
-void nounwind_fixup(unsigned int frames, function<void (int &)> raised_rtn ) {
-	if (frames) {
-		nounwind_fixup(frames - 1, raised_rtn);
-	} else {
-		int fixup = 17;
-		raised_rtn(fixup);
-	}
-}
-
-int main(int argc, char * argv[]) {
-	unsigned int times = 1;
-	unsigned int total_frames = 1;
-	if (1 < argc) {
-		times = strtol(argv[1], nullptr, 10);
-	}
-	if (2 < argc) {
-		total_frames = strtol(argv[2], nullptr, 10);
-	}
-
-	auto raised = [=] (int & fixup) -> void {
-					  fixup = total_frames + 42;		// use local scope => lexical link
-				  };
-	time_point<steady_clock> start_time = steady_clock::now();
-	for (unsigned int count = 0 ; count < times ; ++count) {
-		nounwind_fixup(total_frames, raised);
-	}
-	time_point<steady_clock> end_time = steady_clock::now();
-	nanoseconds duration = duration_cast<nanoseconds>(end_time - start_time);
-	cout << "Run-Time (s): " << fixed << setprecision(1) << duration.count() / 1'000'000'000. << endl;
-}
Index: c/theses/andrew_beach_MMath/code/resume-fixup-empty.py
===================================================================
--- doc/theses/andrew_beach_MMath/code/resume-fixup-empty.py	(revision 65502d83df1b51d0a863dcb592705be3ca7b3c58)
+++ 	(revision )
@@ -1,32 +1,0 @@
-#!/usr/bin/env python3
-
-from time import thread_time_ns
-
-def nounwind_fixup(frames, raised_rtn):
-    if 0 < frames:
-        nounwind_fixup(frames - 1, raised_rtn)
-    else:
-        fixup = 17;
-        raised_rtn(fixup);
-
-
-def main(argv):
-    times = 1
-    total_frames = 1
-    if 1 < len(argv):
-        times = int(argv[1])
-    if 2 < len(argv):
-        total_frames = int(argv[2])
-
-    raised = lambda lfixup : total_frames + 42		# use local scope => lexical link
-    start_time = thread_time_ns()
-    for count in range(times):
-        nounwind_fixup(total_frames, raised)
-
-    end_time = thread_time_ns()
-    print('Run-Time (s) {:.1f}:'.format((end_time - start_time) / 1_000_000_000.))
-
-
-if '__main__' == __name__:
-    import sys
-    main(sys.argv)
Index: c/theses/andrew_beach_MMath/code/resume-fixup-other-f.cfa
===================================================================
--- doc/theses/andrew_beach_MMath/code/resume-fixup-other-f.cfa	(revision 65502d83df1b51d0a863dcb592705be3ca7b3c58)
+++ 	(revision )
@@ -1,46 +1,0 @@
-// Resume Across Fixup
-#include <clock.hfa>
-#include <fstream.hfa>
-#include <stdlib.hfa>									// strto
-
-unsigned int frames;									// use global because of gcc thunk problem
-
-void nounwind_fixup(unsigned int dummy, void (*raised_rtn)(int &), void (*not_raised_rtn)(int &)) {
-	void not_raised(int & fixup) {
-		fixup = frames + 42;							// use local scope => lexical link
-	}
-
-	if (frames) {
-		frames -= 1;
-		nounwind_fixup(42, raised_rtn, not_raised);
-	} else {
-		int fixup = dummy;
-		raised_rtn(fixup);
-	}
-}
-
-int main(int argc, char * argv[]) {
-	unsigned int times = 1;
-	unsigned int total_frames = 1;
-	if (1 < argc) {
-		times = strto(argv[1], 0p, 10);
-	}
-	if (2 < argc) {
-		total_frames = strto(argv[2], 0p, 10);
-	}
-	frames = total_frames;
-
-	void raised(int & fixup) {
-		fixup = total_frames + 42;						// use local scope => lexical link
-	}
-	void not_raised(int & fixup) {
-		fixup = total_frames + 42;						// use local scope => lexical link
-	}
-
-	Time start_time = timeHiRes();
-	for (int count = 0 ; count < times ; ++count) {
-		nounwind_fixup(42, raised, not_raised);
-	}
-	Time end_time = timeHiRes();
-	sout | "Run-Time (s): " | wd(0,1, (end_time - start_time)`ns / 1_000_000_000.);
-}
Index: c/theses/andrew_beach_MMath/code/resume-fixup-other-r.cfa
===================================================================
--- doc/theses/andrew_beach_MMath/code/resume-fixup-other-r.cfa	(revision 65502d83df1b51d0a863dcb592705be3ca7b3c58)
+++ 	(revision )
@@ -1,52 +1,0 @@
-// Resume Across Other Handler
-#include <clock.hfa>
-#include <exception.hfa>
-#include <fstream.hfa>
-#include <stdlib.hfa>									// strto
-
-exception fixup_exception {
-	int & fixup;
-};
-vtable(fixup_exception) fixup_vt;
-exception not_raised_exception {
-	int & fixup;
-};
-
-unsigned int frames;									// use global because of gcc thunk problem
-
-void nounwind_other(unsigned int dummy) {
-	if (frames) {
-		frames -= 1;
-		try {
-			nounwind_other(42);
-		} catchResume (not_raised_exception * ex) {
-			ex->fixup = frames + 42;					// use local scope => lexical link
-		}
-	} else {
-		int fixup = dummy;
-		throwResume (fixup_exception){&fixup_vt, fixup}; // change bad fixup
-	}
-}
-
-int main(int argc, char * argv[]) {
-	unsigned int times = 1;
-	unsigned int total_frames = 1;
-	if (1 < argc) {
-		times = strto(argv[1], 0p, 10);
-	}
-	if (2 < argc) {
-		total_frames = strto(argv[2], 0p, 10);
-	}
-	frames = total_frames;
-
-	Time start_time = timeHiRes();
-	for (int count = 0 ; count < times ; ++count) {
-		try {
-			nounwind_other(42);
-		} catchResume (fixup_exception * ex) {
-			ex->fixup = total_frames + 42;
-		}
-	}
-	Time end_time = timeHiRes();
-	sout | "Run-Time (s): " | wd(0,1, (end_time - start_time)`ns / 1_000_000_000.);
-}
Index: c/theses/andrew_beach_MMath/code/resume-fixup-other.cpp
===================================================================
--- doc/theses/andrew_beach_MMath/code/resume-fixup-other.cpp	(revision 65502d83df1b51d0a863dcb592705be3ca7b3c58)
+++ 	(revision )
@@ -1,49 +1,0 @@
-// Resume Across Fixup
-#include <chrono>
-#include <cstdlib>
-#include <exception>
-#include <iostream>
-#include <iomanip>
-#include <functional>
-
-using namespace std;
-using namespace chrono;
-
-void nounwind_fixup(unsigned int frames, function<void (int &)> raised_rtn, function<void (int &)> not_raised_rtn ) {
-	auto not_raised = [=](int & fixup) -> void {
-						  fixup = frames + 42;			// use local scope => lexical link
-					  };
-
-	if (frames) {
-		nounwind_fixup(frames - 1, raised_rtn, not_raised);
-	} else {
-		int fixup = 17;
-		raised_rtn(fixup);
-	}
-}
-
-int main(int argc, char * argv[]) {
-	unsigned int times = 1;
-	unsigned int total_frames = 1;
-	if (1 < argc) {
-		times = strtol(argv[1], nullptr, 10);
-	}
-	if (2 < argc) {
-		total_frames = strtol(argv[2], nullptr, 10);
-	}
-
-	auto raised = [=] (int & fixup) -> void {
-					  fixup = total_frames + 42;		// use local scope => lexical link
-				  };
-	auto not_raised = [=] (int & fixup) -> void {
-						  fixup = total_frames + 42;	// use local scope => lexical link
-					  };
-
-	time_point<steady_clock> start_time = steady_clock::now();
-	for (unsigned int count = 0 ; count < times ; ++count) {
-		nounwind_fixup(total_frames, raised, not_raised);
-	}
-	time_point<steady_clock> end_time = steady_clock::now();
-	nanoseconds duration = duration_cast<nanoseconds>(end_time - start_time);
-	cout << "Run-Time (s): " << fixed << setprecision(1) << duration.count() / 1'000'000'000. << endl;
-}
Index: c/theses/andrew_beach_MMath/code/resume-fixup-other.py
===================================================================
--- doc/theses/andrew_beach_MMath/code/resume-fixup-other.py	(revision 65502d83df1b51d0a863dcb592705be3ca7b3c58)
+++ 	(revision )
@@ -1,34 +1,0 @@
-#!/usr/bin/env python3
-
-from time import thread_time_ns
-
-def nounwind_fixup(frames, raised_rtn, not_raised_rtn):
-    not_raised = lambda lfixup : frames + 42		# use local scope => lexical link
-    if 0 < frames:
-        nounwind_fixup(frames - 1, raised_rtn, not_raised)
-    else:
-        fixup = 17;
-        raised_rtn(fixup);
-
-
-def main(argv):
-    times = 1
-    total_frames = 1
-    if 1 < len(argv):
-        times = int(argv[1])
-    if 2 < len(argv):
-        total_frames = int(argv[2])
-
-    raised = lambda lfixup : total_frames + 42		# use local scope => lexical link
-    not_raised = lambda lfixup : total_frames + 42	# use local scope => lexical link
-    start_time = thread_time_ns()
-    for count in range(times):
-        nounwind_fixup(total_frames, raised, not_raised)
-
-    end_time = thread_time_ns()
-    print('Run-Time (s) {:.1f}:'.format((end_time - start_time) / 1_000_000_000.))
-
-
-if '__main__' == __name__:
-    import sys
-    main(sys.argv)
Index: doc/theses/andrew_beach_MMath/code/run.sh
===================================================================
--- doc/theses/andrew_beach_MMath/code/run.sh	(revision 65502d83df1b51d0a863dcb592705be3ca7b3c58)
+++ doc/theses/andrew_beach_MMath/code/run.sh	(revision 180f249d8c08c772b9b9314d1b36dd26f03cd3cb)
@@ -1,6 +1,6 @@
 #!/usr/bin/env bash
 
-readonly ALL_TESTS=(raise-{empty,detor,finally,other} try-{catch,finally} cond-match-{all,none} \
-		    raise-{fixup-empty,fixup-other})
+readonly ALL_TESTS=(raise-{empty,detor,finally,other} try-{catch,finally} \
+			cond-match-{all,none} fixup-{empty,other})
 
 gen-file-name() (
@@ -18,5 +18,4 @@
 )
 
-#readonly N=${1:-5}
 readonly N=${1:-1}
 readonly OUT_FILE=$(gen-file-name ${2:-run-%-$N})
Index: doc/theses/andrew_beach_MMath/code/test.sh
===================================================================
--- doc/theses/andrew_beach_MMath/code/test.sh	(revision 65502d83df1b51d0a863dcb592705be3ca7b3c58)
+++ doc/theses/andrew_beach_MMath/code/test.sh	(revision 180f249d8c08c772b9b9314d1b36dd26f03cd3cb)
@@ -13,8 +13,10 @@
 #   View the result from TEST in LANGUAGE stored in FILE.
 
-readonly ITERS_1M=1000000 # 1 000 000, one million
-readonly ITERS_10M=10000000 # 10 000 000, ten million
-readonly ITERS_100M=100000000 # 100 000 000, hundred million
-readonly ITERS_1000M=1000000000 # 1 000 000 000, billion
+readonly MIL=000000
+# Various preset values used as arguments.
+readonly ITERS_1M=1$MIL
+readonly ITERS_10M=10$MIL
+readonly ITERS_100M=100$MIL
+readonly ITERS_1000M=1000$MIL
 readonly STACK_HEIGHT=100
 
@@ -30,6 +32,10 @@
 	case "$1" in
 	*.cfa)
-		# Requires a symbolic link.
-		mmake "${1%.cfa}" "$1" cfa -DNDEBUG -nodebug -O3 "$1" -o "${1%.cfa}"
+		# A symbolic link/local copy can be used as an override.
+		cmd=./cfa
+		if [ ! -x $cmd ]; then
+			cmd=cfa
+		fi
+		mmake "${1%.cfa}" "$1" $cmd -DNDEBUG -nodebug -O3 "$1" -o "${1%.cfa}"
 		;;
 	*.cpp)
@@ -83,5 +89,5 @@
 raise-empty)
 	CFAT="./throw-empty $ITERS_1M $STACK_HEIGHT"
-# see resume-fixup-empty-r	CFAR="./resume-empty $ITERS_1M $STACK_HEIGHT"
+	CFAR="./resume-empty $ITERS_1M $STACK_HEIGHT"
 	CPP="./throw-empty-cpp $ITERS_1M $STACK_HEIGHT"
 	JAVA="java ThrowEmpty $ITERS_1M $STACK_HEIGHT"
@@ -90,5 +96,5 @@
 raise-detor)
 	CFAT="./throw-detor $ITERS_1M $STACK_HEIGHT"
-# N/A	CFAR="./resume-detor $ITERS_1M $STACK_HEIGHT"
+	CFAR="./resume-detor $ITERS_1M $STACK_HEIGHT"
 	CPP="./throw-detor-cpp $ITERS_1M $STACK_HEIGHT"
 	JAVA=unsupported
@@ -97,5 +103,5 @@
 raise-finally)
 	CFAT="./throw-finally $ITERS_1M $STACK_HEIGHT"
-# N/A	CFAR="./resume-finally $ITERS_1M $STACK_HEIGHT"
+	CFAR="./resume-finally $ITERS_1M $STACK_HEIGHT"
 	CPP=unsupported
 	JAVA="java ThrowFinally $ITERS_1M $STACK_HEIGHT"
@@ -104,5 +110,5 @@
 raise-other)
 	CFAT="./throw-other $ITERS_1M $STACK_HEIGHT"
-# N/A	CFAR="./resume-other $ITERS_1M $STACK_HEIGHT"
+	CFAR="./resume-other $ITERS_1M $STACK_HEIGHT"
 	CPP="./throw-other-cpp $ITERS_1M $STACK_HEIGHT"
 	JAVA="java ThrowOther $ITERS_1M $STACK_HEIGHT"
@@ -137,17 +143,17 @@
 	PYTHON="./cond-catch.py $ITERS_10M 0"
 	;;
-raise-fixup-empty)
-	CFAT="./resume-fixup-empty-f $ITERS_10M $STACK_HEIGHT"
-	CFAR="./resume-fixup-empty-r $ITERS_10M $STACK_HEIGHT"
-	CPP="./resume-fixup-empty-cpp $ITERS_10M $STACK_HEIGHT"
-	JAVA="java ResumeFixupEmpty $ITERS_10M $STACK_HEIGHT"
-	PYTHON="./resume-fixup-empty.py $ITERS_10M $STACK_HEIGHT"
+fixup-empty)
+	CFAT="./fixup-empty-f $ITERS_10M $STACK_HEIGHT"
+	CFAR="./fixup-empty-r $ITERS_10M $STACK_HEIGHT"
+	CPP="./fixup-empty-cpp $ITERS_10M $STACK_HEIGHT"
+	JAVA="java FixupEmpty $ITERS_10M $STACK_HEIGHT"
+	PYTHON="./fixup-empty.py $ITERS_10M $STACK_HEIGHT"
 	;;
-raise-fixup-other)
-	CFAT="./resume-fixup-other-f $ITERS_10M $STACK_HEIGHT"
-	CFAR="./resume-fixup-other-r $ITERS_10M $STACK_HEIGHT"
-	CPP="./resume-fixup-other-cpp $ITERS_10M $STACK_HEIGHT"
-	JAVA="java ResumeFixupOther $ITERS_10M $STACK_HEIGHT"
-	PYTHON="./resume-fixup-other.py $ITERS_10M $STACK_HEIGHT"
+fixup-other)
+	CFAT="./fixup-other-f $ITERS_10M $STACK_HEIGHT"
+	CFAR="./fixup-other-r $ITERS_10M $STACK_HEIGHT"
+	CPP="./fixup-other-cpp $ITERS_10M $STACK_HEIGHT"
+	JAVA="java FixupOther $ITERS_10M $STACK_HEIGHT"
+	PYTHON="./fixup-other.py $ITERS_10M $STACK_HEIGHT"
 	;;
 *)
Index: doc/theses/andrew_beach_MMath/code/throw-empty.py
===================================================================
--- doc/theses/andrew_beach_MMath/code/throw-empty.py	(revision 65502d83df1b51d0a863dcb592705be3ca7b3c58)
+++ doc/theses/andrew_beach_MMath/code/throw-empty.py	(revision 180f249d8c08c772b9b9314d1b36dd26f03cd3cb)
@@ -33,5 +33,5 @@
 
     end_time = thread_time_ns()
-    print('Run-Time (s) {:.1f}:'.format((end_time - start_time) / 1_000_000_000.))
+    print('Run-Time (s): {:.1f}'.format((end_time - start_time) / 1_000_000_000.))
 
 
Index: doc/theses/andrew_beach_MMath/code/throw-finally.py
===================================================================
--- doc/theses/andrew_beach_MMath/code/throw-finally.py	(revision 65502d83df1b51d0a863dcb592705be3ca7b3c58)
+++ doc/theses/andrew_beach_MMath/code/throw-finally.py	(revision 180f249d8c08c772b9b9314d1b36dd26f03cd3cb)
@@ -36,5 +36,5 @@
 
     end_time = thread_time_ns()
-    print('Run-Time (s) {:.1f}:'.format((end_time - start_time) / 1_000_000_000.))
+    print('Run-Time (s): {:.1f}'.format((end_time - start_time) / 1_000_000_000.))
 
 
Index: doc/theses/andrew_beach_MMath/code/throw-other.py
===================================================================
--- doc/theses/andrew_beach_MMath/code/throw-other.py	(revision 65502d83df1b51d0a863dcb592705be3ca7b3c58)
+++ doc/theses/andrew_beach_MMath/code/throw-other.py	(revision 180f249d8c08c772b9b9314d1b36dd26f03cd3cb)
@@ -40,5 +40,5 @@
 
     end_time = thread_time_ns()
-    print('Run-Time (s) {:.1f}:'.format((end_time - start_time) / 1_000_000_000.))
+    print('Run-Time (s): {:.1f}'.format((end_time - start_time) / 1_000_000_000.))
 
 
Index: doc/theses/andrew_beach_MMath/code/throw-with.py
===================================================================
--- doc/theses/andrew_beach_MMath/code/throw-with.py	(revision 65502d83df1b51d0a863dcb592705be3ca7b3c58)
+++ doc/theses/andrew_beach_MMath/code/throw-with.py	(revision 180f249d8c08c772b9b9314d1b36dd26f03cd3cb)
@@ -43,5 +43,5 @@
 
     end_time = thread_time_ns()
-    print('Run-Time (s) {:.1f}:'.format((end_time - start_time) / 1_000_000_000.))
+    print('Run-Time (s): {:.1f}'.format((end_time - start_time) / 1_000_000_000.))
 
 
Index: doc/theses/andrew_beach_MMath/code/try-catch.py
===================================================================
--- doc/theses/andrew_beach_MMath/code/try-catch.py	(revision 65502d83df1b51d0a863dcb592705be3ca7b3c58)
+++ doc/theses/andrew_beach_MMath/code/try-catch.py	(revision 180f249d8c08c772b9b9314d1b36dd26f03cd3cb)
@@ -23,5 +23,5 @@
 
     end_time = thread_time_ns()
-    print('Run-Time (s) {:.1f}:'.format((end_time - start_time) / 1_000_000_000.))
+    print('Run-Time (s): {:.1f}'.format((end_time - start_time) / 1_000_000_000.))
 
 
Index: doc/theses/andrew_beach_MMath/code/try-finally.py
===================================================================
--- doc/theses/andrew_beach_MMath/code/try-finally.py	(revision 65502d83df1b51d0a863dcb592705be3ca7b3c58)
+++ doc/theses/andrew_beach_MMath/code/try-finally.py	(revision 180f249d8c08c772b9b9314d1b36dd26f03cd3cb)
@@ -22,5 +22,5 @@
 
     end_time = thread_time_ns()
-    print('Run-Time (s) {:.1f}:'.format((end_time - start_time) / 1_000_000_000.))
+    print('Run-Time (s): {:.1f}'.format((end_time - start_time) / 1_000_000_000.))
 
 
Index: doc/theses/andrew_beach_MMath/existing.tex
===================================================================
--- doc/theses/andrew_beach_MMath/existing.tex	(revision 65502d83df1b51d0a863dcb592705be3ca7b3c58)
+++ doc/theses/andrew_beach_MMath/existing.tex	(revision 180f249d8c08c772b9b9314d1b36dd26f03cd3cb)
@@ -224,6 +224,5 @@
 The global definition of @do_once@ is ignored, however if quadruple took a
 @double@ argument, then the global definition would be used instead as it
-would then be a better match.
-\todo{cite Aaron's thesis (maybe)}
+would then be a better match.\cite{Moss19}
 
 To avoid typing long lists of assertions, constraints can be collected into
Index: doc/theses/andrew_beach_MMath/features.tex
===================================================================
--- doc/theses/andrew_beach_MMath/features.tex	(revision 65502d83df1b51d0a863dcb592705be3ca7b3c58)
+++ doc/theses/andrew_beach_MMath/features.tex	(revision 180f249d8c08c772b9b9314d1b36dd26f03cd3cb)
@@ -162,4 +162,7 @@
 type a child of that type and part of the same tree. The parent may itself
 be a child or a root type and may have any number of existing children.
+
+% OK, for some reason the b and t positioning options are reversed here.
+\begin{minipage}[b]{0.6\textwidth}
 \begin{cfa}
 trait child_a(T) virtual(root_type) {}
@@ -167,5 +170,10 @@
 trait child_b(T) virtual(root_type) {}
 \end{cfa}
-\todo{Update the diagram in vtable.fig to show the new type tree.}
+\end{minipage}
+\begin{minipage}{0.4\textwidth}
+\begin{center}
+\input{virtual-tree}
+\end{center}
+\end{minipage}
 
 Every virtual type also has a list of virtual members and a unique id,
@@ -499,5 +507,5 @@
 throwResume EXPRESSION;
 \end{cfa}
-\todo{Decide on a final set of keywords and use them everywhere.}
+% The new keywords are currently ``experimental" and not used in this work.
 It works much the same way as the termination raise, except the
 type must satisfy the \snake{is_resumption_exception} that uses the
@@ -544,6 +552,6 @@
 and run, its try block (the guarded statements) and every try statement
 searched before it are still on the stack. There presence can lead to
-the recursive resumption problem.
-\todo{Is there a citation for the recursive resumption problem?}
+the recursive resumption problem.\cite{Buhr00a}
+% Other possible citation is MacLaren77, but the form is different.
 
 The recursive resumption problem is any situation where a resumption handler
Index: doc/theses/andrew_beach_MMath/future.tex
===================================================================
--- doc/theses/andrew_beach_MMath/future.tex	(revision 65502d83df1b51d0a863dcb592705be3ca7b3c58)
+++ doc/theses/andrew_beach_MMath/future.tex	(revision 180f249d8c08c772b9b9314d1b36dd26f03cd3cb)
@@ -21,4 +21,8 @@
 capability, programmers will want to use it. Once fixed, this capability should
 result in little or no change in the exception system but simplify usage.
+\item
+The @copy@ function in the exception virtual table is an adapter to address
+some limitations in the \CFA copy constructor. If the copy constructor is
+improved it can be used directly without the adapter.
 \item
 Termination handlers cannot use local control-flow transfers, \eg by @break@,
@@ -57,4 +61,8 @@
 type is a child of another. This check precisely captures many of the
 current ad-hoc correctness requirements.
+
+Other features of the virtual system could also remove some of the
+special cases around exception virtual tables, such as the generation
+of the @msg@ function, could be removed.
 
 The full virtual system might also include other improvement like associated
Index: doc/theses/andrew_beach_MMath/implement.tex
===================================================================
--- doc/theses/andrew_beach_MMath/implement.tex	(revision 65502d83df1b51d0a863dcb592705be3ca7b3c58)
+++ doc/theses/andrew_beach_MMath/implement.tex	(revision 180f249d8c08c772b9b9314d1b36dd26f03cd3cb)
@@ -99,5 +99,5 @@
 
 Type information is constructed as follows:
-\begin{enumerate}
+\begin{enumerate}[nosep]
 \item
 Use the type's name to generate a name for the type information structure,
@@ -123,5 +123,4 @@
 including different instances of the same polymorphic type.
 \end{enumerate}
-\todo{The list is making me realize, some of this isn't ordered.}
 
 Writing that code manually, with helper macros for the early name mangling,
@@ -176,6 +175,5 @@
 below.
 
-The layout always comes in three parts.
-\todo{Add labels to the virtual table layout figure.}
+The layout always comes in three parts (see \autoref{f:VirtualTableLayout}).
 The first section is just the type id at the head of the table. It is always
 there to ensure that it can be found even when the accessing code does not
@@ -190,8 +188,9 @@
 
 \begin{figure}
+\begin{center}
 \input{vtable-layout}
+\end{center}
 \caption{Virtual Table Layout}
 \label{f:VirtualTableLayout}
-\todo*{Improve the Virtual Table Layout diagram.}
 \end{figure}
 
@@ -674,5 +673,5 @@
 \newsavebox{\stackBox}
 \begin{lrbox}{\codeBox}
-\begin{lstlisting}[language=CFA,{moredelim=**[is][\color{red}]{@}{@}}]
+\begin{cfa}
 unsigned num_exceptions = 0;
 void throws() {
@@ -693,17 +692,17 @@
     throws();
 }
-\end{lstlisting}
+\end{cfa}
 \end{lrbox}
 
 \begin{lrbox}{\stackBox}
 \begin{lstlisting}
-| try-finally
-| try-catch (Example)
+| finally block (Example)
+| try block
 throws()
-| try-finally
-| try-catch (Example)
+| finally block (Example)
+| try block
 throws()
-| try-finally
-| try-catch (Example)
+| finally block (Example)
+| try block
 throws()
 main()
@@ -718,5 +717,4 @@
 \label{f:MultipleExceptions}
 \end{figure}
-\todo*{Work on multiple exceptions code sample.}
 
 All exceptions are stored in nodes, which are then linked together in lists
@@ -797,5 +795,4 @@
 \autoref{f:TerminationTransformation} shows the pattern used to transform
 a \CFA try statement with catch clauses into the appropriate C functions.
-\todo{Explain the Termination Transformation figure.}
 
 \begin{figure}
@@ -855,5 +852,4 @@
 \caption{Termination Transformation}
 \label{f:TerminationTransformation}
-\todo*{Improve (compress?) Termination Transformations.}
 \end{figure}
 
@@ -894,6 +890,6 @@
 
 \autoref{f:ResumptionTransformation} shows the pattern used to transform
-a \CFA try statement with catch clauses into the appropriate C functions.
-\todo{Explain the Resumption Transformation figure.}
+a \CFA try statement with catchResume clauses into the appropriate
+C functions.
 
 \begin{figure}
@@ -936,5 +932,4 @@
 \caption{Resumption Transformation}
 \label{f:ResumptionTransformation}
-\todo*{Improve (compress?) Resumption Transformations.}
 \end{figure}
 
@@ -964,5 +959,4 @@
 \caption{Resumption Marking}
 \label{f:ResumptionMarking}
-\todo*{Label Resumption Marking to aid clarity.}
 \end{figure}
 
Index: doc/theses/andrew_beach_MMath/intro.tex
===================================================================
--- doc/theses/andrew_beach_MMath/intro.tex	(revision 65502d83df1b51d0a863dcb592705be3ca7b3c58)
+++ doc/theses/andrew_beach_MMath/intro.tex	(revision 180f249d8c08c772b9b9314d1b36dd26f03cd3cb)
@@ -125,10 +125,11 @@
 with papers on the subject dating back 70s.\cite{Goodenough75}
 Early exceptions were often treated as signals, which carried no information
-except their identity. Ada still uses this system.\todo{cite Ada}
+except their identity.
+Ada originally used this system\cite{Ada}, but now allows for a string
+message as a payload\cite{Ada12}.
 
 The modern flag-ship for termination exceptions is \Cpp,
 which added them in its first major wave of non-object-orientated features
-in 1990.
-\todo{cite https://en.cppreference.com/w/cpp/language/history}
+in 1990.\cite{CppHistory}
 Many EHMs have special exception types,
 however \Cpp has the ability to use any type as an exception.
@@ -146,5 +147,5 @@
 impossible to actually handle any errors.
 
-Java was the next popular language to use exceptions. \todo{cite Java}
+Java was the next popular language to use exceptions.\cite{Java8}
 Its exception system largely reflects that of \Cpp, except that requires
 you throw a child type of \code{Java}{java.lang.Throwable}
@@ -181,5 +182,5 @@
 % http://bitsavers.informatik.uni-stuttgart.de/pdf/xerox/parc/techReports/
 %   CSL-79-3_Mesa_Language_Manual_Version_5.0.pdf
-Mesa is one programming language that did.\todo{cite Mesa} Experience with Mesa
+Mesa is one programming language that did.\cite{Mesa} Experience with Mesa
 is quoted as being one of the reasons resumptions were not
 included in the \Cpp standard.
@@ -210,9 +211,9 @@
 languages, replaced by ``panic".
 In Rust, a panic is just a program level abort that may be implemented by
-unwinding the stack like in termination exception handling.\todo{cite Rust}
-% https://doc.rust-lang.org/std/panic/fn.catch_unwind.html
+unwinding the stack like in termination exception
+handling.\cite{RustPanicMacro}\cite{RustPanicModule}
 Go's panic through is very similar to a termination, except it only supports
 a catch-all by calling \code{Go}{recover()}, simplifying the interface at
-the cost of flexibility.\todo{cite Go}
+the cost of flexibility.\cite{Go:2021}
 
 %\subsection
@@ -291,8 +292,7 @@
 This difference is less important in higher-level scripting languages,
 where using exception for other tasks is more common.
-An iconic example is Python's \code{Python}{StopIteration} exception that
+An iconic example is Python's
+\code{Python}{StopIteration}\cite{PythonExceptions} exception that
 is thrown by an iterator to indicate that it is exhausted.
 When paired with Python's iterator-based for-loop this will be thrown every
-time the end of the loop is reached.
-\todo{Cite Python StopIteration and for-each loop.}
-% https://docs.python.org/3/library/exceptions.html#StopIteration
+time the end of the loop is reached.\cite{PythonForLoop}
Index: doc/theses/andrew_beach_MMath/performance.tex
===================================================================
--- doc/theses/andrew_beach_MMath/performance.tex	(revision 65502d83df1b51d0a863dcb592705be3ca7b3c58)
+++ doc/theses/andrew_beach_MMath/performance.tex	(revision 180f249d8c08c772b9b9314d1b36dd26f03cd3cb)
@@ -74,10 +74,9 @@
 three results are discarded and the remaining five values are averaged.
 The test are run with the latest (still pre-release) \CFA compiler,
-using gcc-10 as a backend.
-g++-10 is used for \Cpp.
+using gcc-10 10.3.0 as a backend.
+g++-10 10.3.0 is used for \Cpp.
 Java tests are complied and run with version 11.0.11.
-Python used version 3.8.
+Python used version 3.8.10.
 The machines used to run the tests are:
-\todo{Get patch versions for python, gcc and g++.}
 \begin{itemize}[nosep]
 \item ARM 2280 Kunpeng 920 48-core 2$\times$socket
@@ -312,5 +311,5 @@
 For example, there are a few cases where Python out-performs
 \CFA, \Cpp and Java.
-\todo{Make sure there are still cases where Python wins.}
+% To be exact, the Match All and Match None cases.
 The most likely explanation is that, since exceptions
 are rarely considered to be the common case, the more optimized languages
@@ -351,5 +350,4 @@
 finally clauses seem to avoid the spike that run-time destructors have.
 Possibly some optimization removes the cost of changing contexts.
-\todo{OK, I think the finally clause may have been optimized out.}
 
 \item[Other Traversal]
@@ -362,5 +360,4 @@
 but they could avoid the spike by not having the same kind of overhead for
 switching to the check's context.
-\todo{Could revisit Other Traversal, after Finally Traversal.}
 
 \item[Cross Handler]
Index: doc/theses/andrew_beach_MMath/resumption-marking.fig
===================================================================
--- doc/theses/andrew_beach_MMath/resumption-marking.fig	(revision 65502d83df1b51d0a863dcb592705be3ca7b3c58)
+++ doc/theses/andrew_beach_MMath/resumption-marking.fig	(revision 180f249d8c08c772b9b9314d1b36dd26f03cd3cb)
@@ -32,16 +32,4 @@
 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
 	1 1 1.00 60.00 120.00
-	 2205 1620 1845 1620
-2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
-	1 1 1.00 60.00 120.00
-	 3735 2340 3375 2340
-2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
-	1 1 1.00 60.00 120.00
-	 5445 945 5085 945
-2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
-	1 1 1.00 60.00 120.00
-	 7065 1620 6705 1620
-2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
-	1 1 1.00 60.00 120.00
 	 1665 1755 1665 2205
 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
@@ -60,12 +48,40 @@
 	1 1 1.00 60.00 120.00
 	 6525 2475 6525 2925
-4 1 0 50 -1 0 12 0.0000 0 135 945 1665 3375 Initial State\001
-4 1 0 50 -1 0 12 0.0000 0 135 1215 3195 3375 Found Handler\001
-4 1 0 50 -1 0 12 0.0000 0 180 1605 6570 3375 Handling Complete\001
-4 0 0 50 -1 0 12 0.0000 0 135 390 3825 2385 head\001
-4 0 0 50 -1 0 12 0.0000 0 135 390 5535 990 head\001
-4 0 0 50 -1 0 12 0.0000 0 135 390 7155 1665 head\001
-4 2 0 50 -1 0 12 0.0000 0 135 690 1485 2385 handlers\001
-4 1 0 50 -1 0 12 0.0000 0 135 855 4905 3375 Handler in\001
-4 1 0 50 -1 0 12 0.0000 0 180 795 4905 3600 Try block\001
-4 0 0 50 -1 0 12 0.0000 0 135 390 2295 1665 head\001
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	1 1 1.00 60.00 120.00
+	 1260 1620 1485 1620
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	1 1 1.00 60.00 120.00
+	 1980 1440 1755 1440
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	1 1 1.00 60.00 120.00
+	 2790 2340 3015 2340
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	1 1 1.00 60.00 120.00
+	 3600 1620 3375 1620
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	1 1 1.00 60.00 120.00
+	 4500 945 4725 945
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	1 1 1.00 60.00 120.00
+	 5265 765 5040 765
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	1 1 1.00 60.00 120.00
+	 6120 1620 6345 1620
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	1 1 1.00 60.00 120.00
+	 6840 1440 6615 1440
+4 1 0 50 -1 0 12 0.0000 0 135 1170 1665 3375 Initial State\001
+4 1 0 50 -1 0 12 0.0000 0 135 1170 3195 3375 Found Handler\001
+4 1 0 50 -1 0 12 0.0000 0 165 1530 6570 3375 Handling Complete\001
+4 2 0 50 -1 0 12 0.0000 0 135 720 1485 2385 handlers\001
+4 1 0 50 -1 0 12 0.0000 0 135 900 4905 3375 Handler in\001
+4 1 0 50 -1 0 12 0.0000 0 165 810 4905 3600 Try block\001
+4 0 0 50 -1 0 12 0.0000 0 135 360 855 1665 head\001
+4 0 0 50 -1 0 12 0.0000 4 120 810 2025 1485 execution\001
+4 0 0 50 -1 0 12 0.0000 0 135 360 2385 2385 head\001
+4 0 0 50 -1 0 12 0.0000 4 120 810 3645 1665 execution\001
+4 0 0 50 -1 0 12 0.0000 0 135 360 4095 990 head\001
+4 0 0 50 -1 0 12 0.0000 4 120 810 5310 810 execution\001
+4 0 0 50 -1 0 12 0.0000 0 135 360 5715 1665 head\001
+4 0 0 50 -1 0 12 0.0000 4 120 810 6885 1485 execution\001
Index: doc/theses/andrew_beach_MMath/uw-ethesis-frontpgs.tex
===================================================================
--- doc/theses/andrew_beach_MMath/uw-ethesis-frontpgs.tex	(revision 65502d83df1b51d0a863dcb592705be3ca7b3c58)
+++ doc/theses/andrew_beach_MMath/uw-ethesis-frontpgs.tex	(revision 180f249d8c08c772b9b9314d1b36dd26f03cd3cb)
@@ -129,5 +129,21 @@
 \begin{center}\textbf{Abstract}\end{center}
 
-This is the abstract.
+The \CFA (Cforall) programming language is an evolutionary refinement of
+the C programming language, adding modern programming features without
+changing the programming paradigms of C.
+One of these modern programming features is more powerful error handling
+through the addition of an exception handling mechanism (EHM).
+
+This thesis covers the design and implementation of the \CFA EHM,
+along with a review of the other required \CFA features.
+The EHM includes common features of termination exception handling and
+similar support for resumption exception handling.
+The design of both has been adapted to utilize other tools \CFA provides,
+as well as fit with the assertion based interfaces of the language.
+
+The EHM has been implemented into the \CFA compiler and run-time environment.
+Although it has not yet been optimized, performance testing has shown it has
+comparable performance to other EHM's,
+which is sufficient for use in current \CFA programs.
 
 \cleardoublepage
@@ -138,5 +154,7 @@
 \begin{center}\textbf{Acknowledgements}\end{center}
 
-I would like to thank all the little people who made this thesis possible.
+I would like to thank all the people who made this thesis possible.
+(I'm waiting until who is involved is finalized.)
+
 \cleardoublepage
 
Index: doc/theses/andrew_beach_MMath/uw-ethesis.bib
===================================================================
--- doc/theses/andrew_beach_MMath/uw-ethesis.bib	(revision 65502d83df1b51d0a863dcb592705be3ca7b3c58)
+++ doc/theses/andrew_beach_MMath/uw-ethesis.bib	(revision 180f249d8c08c772b9b9314d1b36dd26f03cd3cb)
@@ -1,4 +1,5 @@
 % Bibliography of key references for "LaTeX for Thesis and Large Documents"
 % For use with BibTeX
+% The online reference does not seem to be supported here.
 
 @misc{Dice21,
@@ -15,2 +16,49 @@
     howpublished= {\href{https://github.com/cforall/ExceptionBenchmarks_SPE20}{https://\-github.com/\-cforall/\-ExceptionBenchmarks\_SPE20}},
 }
+
+% Could not get `#the-for-statement` to work.
+@misc{PythonForLoop,
+    author={Python Software Foundation},
+    key={Python Compound Statements},
+    howpublished={\href{https://docs.python.org/3/reference/compound_stmts.html}{https://\-docs.python.org/\-3/\-reference/\-compound\_stmts.html}},
+    addendum={Accessed 2021-08-30},
+}
+
+% Again, I would like this to have `#StopIteration`.
+@misc{PythonExceptions,
+    author={Python Software Foundation},
+    key={Python Exceptions},
+    howpublished={\href{https://docs.python.org/3/library/exceptions.html}{https://\-docs.python.org/\-3/\-library/\-exceptions.html}},
+    addendum={Accessed 2021-08-30},
+}
+
+@misc{CppHistory,
+    author={C++ Community},
+    key={Cpp Reference History},
+    howpublished={\href{https://en.cppreference.com/w/cpp/language/history}{https://\-en.cppreference.com/\-w/\-cpp/\-language/\-history}},
+    addendum={Accessed 2021-08-30},
+}
+
+@misc{RustPanicMacro,
+    author={The Rust Team},
+    key={Rust Panic Macro},
+    howpublished={\href{https://doc.rust-lang.org/std/panic/index.html}{https://\-doc.rust-lang.org/\-std/\-panic/\-index.html}},
+    addendum={Accessed 2021-08-31},
+}
+
+@misc{RustPanicModule,
+    author={The Rust Team},
+    key={Rust Panic Module},
+    howpublished={\href{https://doc.rust-lang.org/std/panic/index.html}{https://\-doc.rust-lang.org/\-std/\-panic/\-index.html}},
+    addendum={Accessed 2021-08-31},
+}
+
+@manual{Go:2021,
+    keywords={Go programming language},
+    author={Robert Griesemer and Rob Pike and Ken Thompson},
+    title={{Go} Programming Language},
+    organization={Google},
+    year=2021,
+    note={\href{http://golang.org/ref/spec}{http://\-golang.org/\-ref/\-spec}},
+    addendum={Accessed 2021-08-31},
+}
Index: doc/theses/andrew_beach_MMath/virtual-tree.fig
===================================================================
--- doc/theses/andrew_beach_MMath/virtual-tree.fig	(revision 180f249d8c08c772b9b9314d1b36dd26f03cd3cb)
+++ doc/theses/andrew_beach_MMath/virtual-tree.fig	(revision 180f249d8c08c772b9b9314d1b36dd26f03cd3cb)
@@ -0,0 +1,23 @@
+#FIG 3.2  Produced by xfig version 3.2.7b
+Landscape
+Center
+Metric
+A4
+100.00
+Single
+-2
+1200 2
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	1 1 1.00 45.00 90.00
+	 2070 1395 2520 1665
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	1 1 1.00 45.00 90.00
+	 2070 1395 1530 1665
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	1 1 1.00 45.00 90.00
+	 1530 1845 1530 2160
+4 0 0 50 -1 0 12 0.0000 4 165 900 1035 2295 grandchild\001
+4 1 0 50 -1 5 12 0.0000 2 150 720 1485 1800 child\\_a\001
+4 1 0 50 -1 5 12 0.0000 2 150 720 2520 1800 child\\_b\001
+4 1 0 50 -1 5 12 0.0000 2 165 900 2070 1350 root\\_type\001
+4 1 0 50 -1 0 12 0.0000 2 165 1530 2115 1080 Virtual Type Tree\001
Index: doc/theses/andrew_beach_MMath/vtable-layout.fig
===================================================================
--- doc/theses/andrew_beach_MMath/vtable-layout.fig	(revision 65502d83df1b51d0a863dcb592705be3ca7b3c58)
+++ doc/theses/andrew_beach_MMath/vtable-layout.fig	(revision 180f249d8c08c772b9b9314d1b36dd26f03cd3cb)
@@ -8,6 +8,4 @@
 -2
 1200 2
-2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 1
-	 1620 1665
 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
 	 3510 1890 3645 1755
@@ -16,4 +14,10 @@
 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
 	 3645 1305 3645 1755
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
+	 2115 1935 2250 1935
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 4
+	 2250 1170 2115 1170 2115 2475 2250 2475
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
+	 2250 1350 2115 1350
 4 0 0 50 -1 0 12 0.0000 4 165 630 2295 1305 type_id\001
 4 0 0 50 -1 0 12 0.0000 4 165 1170 2295 1500 parent_field0\001
Index: c/theses/andrew_beach_MMath/vtable.fig
===================================================================
--- doc/theses/andrew_beach_MMath/vtable.fig	(revision 65502d83df1b51d0a863dcb592705be3ca7b3c58)
+++ 	(revision )
@@ -1,42 +1,0 @@
-#FIG 3.2  Produced by xfig version 3.2.7b
-Landscape
-Center
-Metric
-A4
-100.00
-Single
--2
-1200 2
-2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
-	1 1 1.00 45.00 90.00
-	 1260 1350 1485 1665
-2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
-	1 1 1.00 45.00 90.00
-	 1260 1350 1035 1665
-2 1 1 1 0 7 50 -1 -1 4.000 0 0 -1 1 0 2
-	1 1 1.00 45.00 90.00
-	 1263 1346 1578 1571
-2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
-	1 1 1.00 45.00 90.00
-	 2520 1350 2520 1665
-2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
-	1 1 1.00 45.00 90.00
-	 2520 1800 2520 2115
-2 1 1 1 0 7 50 -1 -1 4.000 0 0 -1 1 0 2
-	1 1 1.00 45.00 90.00
-	 2520 1350 2835 1575
-2 1 1 1 0 7 50 -1 -1 4.000 0 0 -1 1 0 2
-	1 1 1.00 45.00 90.00
-	 2517 1804 2832 2029
-4 1 0 50 -1 5 12 0.0000 2 120 240 1035 1800 V1\001
-4 1 0 50 -1 5 12 0.0000 2 120 240 1485 1800 V2\001
-4 1 0 50 -1 5 12 0.0000 2 120 240 1260 1350 V0\001
-4 0 0 50 -1 0 12 0.0000 2 135 420 1620 1665 vtable\001
-4 1 0 50 -1 5 12 0.0000 2 120 240 2520 1350 W0\001
-4 1 0 50 -1 5 12 0.0000 2 120 240 2520 2250 W2\001
-4 1 0 50 -1 5 12 0.0000 2 120 240 2520 1800 W1\001
-4 0 0 50 -1 0 12 0.0000 2 135 420 2880 1620 vtable\001
-4 0 0 50 -1 0 12 0.0000 2 135 420 2880 2070 vtable\001
-4 1 0 50 -1 0 12 0.0000 2 180 1365 1935 1080 virtual type trees\001
-4 0 0 50 -1 5 12 0.0000 2 150 735 3060 1755 Id; <,+\001
-4 0 0 50 -1 5 12 0.0000 2 150 1155 3060 2250 Id; <,+,w,-\001
Index: libcfa/src/Makefile.am
===================================================================
--- libcfa/src/Makefile.am	(revision 65502d83df1b51d0a863dcb592705be3ca7b3c58)
+++ libcfa/src/Makefile.am	(revision 180f249d8c08c772b9b9314d1b36dd26f03cd3cb)
@@ -48,4 +48,5 @@
 	math.hfa \
 	time_t.hfa \
+	bits/algorithm.hfa \
 	bits/align.hfa \
 	bits/containers.hfa \
@@ -59,5 +60,4 @@
 	containers/array.hfa \
 	concurrency/iofwd.hfa \
-	concurrency/mutex_stmt.hfa \
 	containers/list.hfa \
 	containers/queueLockFree.hfa \
@@ -78,4 +78,5 @@
 	memory.hfa \
 	parseargs.hfa \
+	parseconfig.hfa \
 	rational.hfa \
 	stdlib.hfa \
@@ -91,5 +92,4 @@
 libsrc = ${inst_headers_src} ${inst_headers_src:.hfa=.cfa} \
 	assert.cfa \
-	bits/algorithm.hfa \
 	bits/debug.cfa \
 	exception.c \
@@ -107,5 +107,6 @@
 	concurrency/invoke.h \
 	concurrency/future.hfa \
-	concurrency/kernel/fwd.hfa
+	concurrency/kernel/fwd.hfa \
+	concurrency/mutex_stmt.hfa
 
 inst_thread_headers_src = \
Index: libcfa/src/parseconfig.cfa
===================================================================
--- libcfa/src/parseconfig.cfa	(revision 180f249d8c08c772b9b9314d1b36dd26f03cd3cb)
+++ libcfa/src/parseconfig.cfa	(revision 180f249d8c08c772b9b9314d1b36dd26f03cd3cb)
@@ -0,0 +1,230 @@
+#include <fstream.hfa>
+#include <parseargs.hfa>
+#include <stdlib.hfa>
+#include <string.h>
+#include "parseconfig.hfa"
+
+
+// *********************************** exceptions ***********************************
+
+
+// TODO: Add names of missing config entries to exception (see further below)
+static vtable(Missing_Config_Entries) Missing_Config_Entries_vt;
+
+[ void ] ?{}( & Missing_Config_Entries this, unsigned int num_missing ) {
+	this.virtual_table = &Missing_Config_Entries_vt;
+	this.num_missing = num_missing;
+}
+
+// TODO: use string interface when it's ready (and implement exception msg protocol)
+[ void ] msg( * Missing_Config_Entries ex ) {
+	serr | nlOff;
+	serr | "The config file is missing " | ex->num_missing;
+	serr | nlOn;
+	if ( ex->num_missing == 1 ) {
+		serr | " entry.";
+	} else {
+		serr | " entries.";
+	}
+} // msg
+
+
+static vtable(Parse_Failure) Parse_Failure_vt;
+
+[ void ] ?{}( & Parse_Failure this, [] char failed_key, [] char failed_value ) {
+	this.virtual_table = &Parse_Failure_vt;
+
+	this.failed_key = alloc( strlen( failed_key ) );
+	this.failed_value = alloc( strlen( failed_value ) );
+	strcpy( this.failed_key, failed_key );
+	strcpy( this.failed_value, failed_value );
+}
+
+[ void ] ^?{}( & Parse_Failure this ) with ( this ) {
+	free( failed_key );
+	free( failed_value );
+}
+
+// TODO: use string interface when it's ready (and implement exception msg protocol)
+[ void ] msg( * Parse_Failure ex ) {
+	serr | "Config entry " | ex->failed_key | " could not be parsed. It has value " | ex->failed_value | ".";
+}
+
+
+static vtable(Validation_Failure) Validation_Failure_vt;
+
+[ void ] ?{}( & Validation_Failure this, [] char failed_key, [] char failed_value ) {
+	this.virtual_table = &Validation_Failure_vt;
+
+	this.failed_key = alloc( strlen( failed_key ) );
+	this.failed_value = alloc( strlen( failed_value ) );
+	strcpy( this.failed_key, failed_key );
+	strcpy( this.failed_value, failed_value );
+}
+
+[ void ] ^?{}( & Validation_Failure this ) with ( this ) {
+	free( failed_key );
+	free( failed_value );
+}
+
+// TODO: use string interface when it's ready (and implement exception msg protocol)
+[ void ] msg( * Validation_Failure ex ) {
+	serr | "Config entry " | ex->failed_key | " could not be validated. It has value " | ex->failed_value | ".";
+}
+
+
+// *********************************** main code ***********************************
+
+
+[ void ] ?{}( & KVPairs kvp ) with ( kvp ) {				// default constructor
+	size = 0; max_size = 0; data = 0p;
+}
+
+[ void ] ?{}( & KVPairs kvp, size_t size ) { 				// initialization
+	kvp.[ size, max_size ] = [ 0, size ];
+	kvp.data = alloc( size );
+}
+
+[ void ] ^?{}( & KVPairs kvp ) with ( kvp ) {				// destructor
+	for ( i; size ) free( data[i] );
+	free( data );
+	size = 0; max_size = 0; data = 0p;
+}
+
+[ void ] add_kv_pair( & KVPairs kv_pairs, [] char key, [] char value ) with ( kv_pairs ) {
+	if ( max_size == 0 ) {
+		max_size = 1;
+		data = alloc( max_size );
+	} else if ( size == max_size ) {
+		max_size *= 2;
+		data = alloc( max_size, data`realloc );
+	}
+
+	data[size].0 = alloc( strlen( key ) );
+	data[size].1 = alloc( strlen( value ) );
+	strcpy( data[size].0, key );
+	strcpy( data[size].1, value );
+	++size;
+} // add_kv_pair
+
+
+[ bool ] comments( & ifstream in, [] char name ) {
+	while () {
+		in | name;
+	  if ( eof( in ) ) return true;
+	  if ( name[0] != '#' ) return false;
+		in | nl;									// ignore remainder of line
+	} // while
+} // comments
+
+// Parse configuration from a file formatted in tabular (CS 343) style
+[ * KVPairs ] parse_tabular_config_format( [] const char config_file, size_t num_entries ) {
+	// TODO: Change this to a unique_ptr when we fully support returning them (move semantics)
+	* KVPairs kv_pairs = new( num_entries );
+
+	ifstream in;
+	try {
+		open( in, config_file );					// open the configuration file for input
+
+		[64] char key;
+		[256] char value;
+
+		while () {									// parameter names can appear in any order
+		  	// NOTE: Must add check to see if already read in value for this key,
+			// once we switch to using hash table as intermediate storage
+		  if ( comments( in, key ) ) break;			// eof ?
+			in | value;
+
+			add_kv_pair( *kv_pairs, key, value );
+
+		  if ( eof( in ) ) break;
+			in | nl;								// ignore remainder of line
+		} // for
+	} catch( Open_Failure * ex; ex->istream == &in ) {
+		delete( kv_pairs );
+		throw *ex;
+	} // try
+	close( in );
+
+	return kv_pairs;
+} // parse_tabular_config_format
+
+// Parse configuration values from intermediate format
+[ void ] parse_config(
+		[] const char config_file,
+		[] config_entry entries,
+		size_t num_entries,
+		KVPairs * (*parser)(const char [], size_t)
+) {
+	* KVPairs kv_pairs = parser( config_file, num_entries );
+
+	int entries_so_far = 0;
+	for ( i; kv_pairs->size ) {
+	  if ( entries_so_far == num_entries ) break;
+
+		char * src_key, * src_value;
+		[ src_key, src_value ] = kv_pairs->data[i];
+
+		for ( j; num_entries ) {
+		  if ( strcmp( src_key, entries[j].key ) != 0 ) continue;
+		  	// Parse the data
+		  	if ( !entries[j].parse( src_value, entries[j].variable ) ) {
+				* Parse_Failure ex = new( src_key, src_value );
+				delete( kv_pairs );
+				throw *ex;
+			}
+
+			// Validate the data
+			if ( !entries[j].validate( entries[j].variable ) ) {
+				* Validation_Failure ex = new( src_key, src_value );
+				delete( kv_pairs );
+				throw *ex;
+			}
+
+			++entries_so_far;
+
+			break;
+		}
+	}
+	// TODO: Once we get vector2+hash_table, we can more easily add the missing config keys to this error
+	if ( entries_so_far < num_entries ) {
+		delete( kv_pairs );
+		throw (Missing_Config_Entries){ num_entries - entries_so_far };
+	}
+
+	delete( kv_pairs );
+} // parse_config
+
+
+// *********************************** validation ***********************************
+
+
+forall(T | Relational( T ))
+[ bool ] is_nonnegative( & T value ) {
+	T zero_val = 0;
+	return value >= zero_val;
+}
+
+forall(T | Relational( T ))
+[ bool ] is_positive( & T value ) {
+	T zero_val = 0;
+	return value > zero_val;
+}
+
+forall(T | Relational( T ))
+[ bool ] is_nonpositive( & T value ) {
+	T zero_val = 0;
+	return value <= zero_val;
+}
+
+forall(T | Relational( T ))
+[ bool ] is_negative( & T value ) {
+	T zero_val = 0;
+	return value < zero_val;
+}
+
+
+// Local Variables: //
+// tab-width: 4 //
+// compile-command: "cfa parseconfig.cfa" //
+// End: //
Index: libcfa/src/parseconfig.hfa
===================================================================
--- libcfa/src/parseconfig.hfa	(revision 180f249d8c08c772b9b9314d1b36dd26f03cd3cb)
+++ libcfa/src/parseconfig.hfa	(revision 180f249d8c08c772b9b9314d1b36dd26f03cd3cb)
@@ -0,0 +1,125 @@
+#pragma once
+
+#include <math.trait.hfa>
+
+
+// *********************************** initial declarations ***********************************
+
+
+struct config_entry {
+	const char * key;
+	void * variable;
+	bool (*parse)( const char *, void * );
+	bool (*validate)( void * );
+};
+
+bool null_validator( void * ) { return true; }
+
+static inline void ?{}( config_entry & this ) {}
+
+forall(T & | { bool parse( const char *, T & ); })
+static inline void ?{}( config_entry & this, const char * key, T & variable ) {
+	this.key      = key;
+	this.variable = (void *)&variable;
+	this.parse    = (bool (*)(const char *, void *))(bool (*)(const char *, T &))parse;
+	this.validate = null_validator;
+}
+
+forall(T & | { bool parse( const char *, T & ); })
+static inline void ?{}( config_entry & this, const char * key, T & variable, bool (*validate)(T &) ) {
+	this.key      = key;
+	this.variable = (void *)&variable;
+	this.parse    = (bool (*)(const char *, void *))(bool (*)(const char *, T &))parse;
+	this.validate = (bool (*)(void *))(bool (*)(T &))validate;
+}
+
+forall(T &)
+static inline void ?{}( config_entry & this, const char * key, T & variable, bool (*parse)(const char *, T &) ) {
+	this.key      = key;
+	this.variable = (void *)&variable;
+	this.parse    = (bool (*)(const char *, void *))(bool (*)(const char *, T &))parse;
+	this.validate = null_validator;
+}
+
+forall(T &)
+static inline void ?{}( config_entry & this, const char * key, T & variable, bool (*parse)(const char *, T &), bool (*validate)(T &) ) {
+	this.key      = key;
+	this.variable = (void *)&variable;
+	this.parse    = (bool (*)(const char *, void *))(bool (*)(const char *, T &))parse;
+	this.validate = (bool (*)(void *))(bool (*)(T &))validate;
+}
+
+// TODO: Replace KVPairs with vector2 when it's fully functional
+struct KVPairs {
+	size_t size, max_size;
+	* [ * char, * char ] data;
+};
+
+[ void ] add_kv_pair( & KVPairs kv_pairs, [] char key, [] char value );
+
+
+// *********************************** exceptions ***********************************
+
+
+exception Missing_Config_Entries {
+	unsigned int num_missing;
+};
+
+[ void ] msg( * Missing_Config_Entries ex );
+
+exception Parse_Failure {
+	* char failed_key;
+	* char failed_value;
+};
+
+[ void ] msg( * Parse_Failure ex );
+
+exception Validation_Failure {
+	* char failed_key;
+	* char failed_value;
+};
+
+[ void ] msg( * Validation_Failure ex );
+
+
+// *********************************** main code ***********************************
+
+
+[ * KVPairs ] parse_tabular_config_format( [] const char config_file, size_t num_entries );
+
+[ void ] parse_config(
+	[] const char config_file,
+	[] config_entry entries,
+	size_t num_entries,
+	KVPairs * (*parser)(const char [], size_t)  // TODO: add sensible default parser when resolver bug is fixed
+);
+
+bool parse( const char *, const char * & );
+bool parse( const char *, int & );
+bool parse( const char *, unsigned & );
+bool parse( const char *, unsigned long & );
+bool parse( const char *, unsigned long long & );
+bool parse( const char *, float & );
+bool parse( const char *, double & );
+
+
+// *********************************** validation ***********************************
+
+
+forall(T | Relational( T ))
+[ bool ] is_nonnegative( & T );
+
+forall(T | Relational( T ))
+[ bool ] is_positive( & T );
+
+forall(T | Relational( T ))
+[ bool ] is_nonpositive( & T );
+
+forall(T | Relational( T ))
+[ bool ] is_negative( & T );
+
+
+// Local Variables: //
+// mode: c //
+// tab-width: 4 //
+// End: //
Index: tests/.expect/parseconfig.txt
===================================================================
--- tests/.expect/parseconfig.txt	(revision 180f249d8c08c772b9b9314d1b36dd26f03cd3cb)
+++ tests/.expect/parseconfig.txt	(revision 180f249d8c08c772b9b9314d1b36dd26f03cd3cb)
@@ -0,0 +1,33 @@
+Different types of destination addresses
+Stop cost: 1
+Number of students: 2
+Number of stops: 2
+Maximum number of students: 5
+Timer delay: 2
+Groupoff delay: 10
+Conductor delay: 5
+Parental delay: 5
+Number of couriers: 1
+Maximum student delay: 10
+Maximum student trips: 3
+
+Open_Failure thrown when config file does not exist
+Failed to open the config file
+
+Missing_Config_Entries thrown when config file is missing entries we want
+The config file is missing 1 entry.
+
+Parse_Failure thrown when an entry cannot be parsed
+Config entry AnothaOne could not be parsed. It has value DjKhaled.
+
+Validation_Failure thrown when an entry fails validation
+Config entry StopCost could not be validated. It has value -1.
+
+No error is thrown when validation succeeds
+Stop cost: 1
+
+A custom parse function can be accepted
+Stop cost: 100
+
+Custom parse and validation functions can be provided together
+Stop cost: 100
Index: tests/.in/parseconfig-all.txt
===================================================================
--- tests/.in/parseconfig-all.txt	(revision 180f249d8c08c772b9b9314d1b36dd26f03cd3cb)
+++ tests/.in/parseconfig-all.txt	(revision 180f249d8c08c772b9b9314d1b36dd26f03cd3cb)
@@ -0,0 +1,12 @@
+StopCost				1	# amount to charge per train stop
+NumStudents				2	# number of students to create
+NumStops				2	# number of train stops; minimum of 2
+MaxNumStudents 			5  	# maximum students each train can carry
+TimerDelay 				2	# length of time between each tick of the timer
+# Going to add a comment here
+MaxStudentDelay			10	# maximum random student delay between trips
+MaxStudentTrips 		3	# maximum number of train trips each student takes
+GroupoffDelay			10	# length of time between initializing gift cards
+ConductorDelay			5  	# length of time between checking on passenger POPs
+ParentalDelay			5	# length of time between cash deposits
+NumCouriers				1	# number of WATCard office couriers in the pool
Index: tests/.in/parseconfig-errors.txt
===================================================================
--- tests/.in/parseconfig-errors.txt	(revision 180f249d8c08c772b9b9314d1b36dd26f03cd3cb)
+++ tests/.in/parseconfig-errors.txt	(revision 180f249d8c08c772b9b9314d1b36dd26f03cd3cb)
@@ -0,0 +1,12 @@
+StopCost				-1	# amount to charge per train stop
+NumStudents				2	# number of students to create
+NumStops				2	# number of train stops; minimum of 2
+MaxNumStudents 			5  	# maximum students each train can carry
+TimerDelay 				2	# length of time between each tick of the timer
+MaxStudentDelay			10	# maximum random student delay between trips
+MaxStudentTrips 		3	# maximum number of train trips each student takes
+GroupoffDelay			10	# length of time between initializing gift cards
+ConductorDelay			5  	# length of time between checking on passenger POPs
+ParentalDelay			5	# length of time between cash deposits
+NumCouriers				1	# number of WATCard office couriers in the pool
+AnothaOne               DjKhaled    # this one will not be used by the user
Index: tests/.in/parseconfig-missing.txt
===================================================================
--- tests/.in/parseconfig-missing.txt	(revision 180f249d8c08c772b9b9314d1b36dd26f03cd3cb)
+++ tests/.in/parseconfig-missing.txt	(revision 180f249d8c08c772b9b9314d1b36dd26f03cd3cb)
@@ -0,0 +1,12 @@
+StopCost				-1	# amount to charge per train stop
+NumStudents				2	# number of students to create
+NumStops				2	# number of train stops; minimum of 2
+MaxNumStudents 			5  	# maximum students each train can carry
+TimerDelay 				2	# length of time between each tick of the timer
+MaxStudentDelay			10	# maximum random student delay between trips
+MaxStudentTrips 		3	# maximum number of train trips each student takes
+GroupoffDelay			10	# length of time between initializing gift cards
+ConductorDelay			5  	# length of time between checking on passenger POPs
+# ParentalDelay			5	# length of time between cash deposits
+NumCouriers				1	# number of WATCard office couriers in the pool
+# Notice I've commented out one of the wanted entries
Index: tests/Makefile.am
===================================================================
--- tests/Makefile.am	(revision 65502d83df1b51d0a863dcb592705be3ca7b3c58)
+++ tests/Makefile.am	(revision 180f249d8c08c772b9b9314d1b36dd26f03cd3cb)
@@ -82,5 +82,6 @@
 	concurrent/clib_tls.c \
 	exceptions/with-threads.hfa \
-	exceptions/except-io.hfa
+	exceptions/except-io.hfa \
+	unified_locking/mutex_test.hfa
 
 dist-hook:
Index: tests/parseconfig.cfa
===================================================================
--- tests/parseconfig.cfa	(revision 180f249d8c08c772b9b9314d1b36dd26f03cd3cb)
+++ tests/parseconfig.cfa	(revision 180f249d8c08c772b9b9314d1b36dd26f03cd3cb)
@@ -0,0 +1,146 @@
+#include <fstream.hfa>
+#include <parseconfig.hfa>
+#include <stdlib.hfa>
+
+extern "C" {
+	extern long long int strtoll( const char* str, char** endptr, int base );
+}
+
+#define xstr(s) str(s)
+#define str(s) #s
+
+bool custom_parse( const char * arg, int & value ) {
+	char * end;
+	int r = strtoll( arg, &end, 10 );
+  if ( *end != '\0' ) return false;
+
+	value = r + 99;
+	return true;
+}
+
+int main() {
+	struct {
+        int stop_cost;
+        int num_students;
+        int num_stops;
+        int max_num_students;
+        int timer_delay;
+        int groupoff_delay;
+    } config_params;
+    int conductor_delay;
+    [2] int parental_delay_and_num_couriers;
+    [ int, int ] max_student_delay_and_trips;
+
+	const size_t NUM_ENTRIES = 11;
+	config_entry entries[NUM_ENTRIES] = {
+		{ "StopCost", config_params.stop_cost },
+        { "NumStudents", config_params.num_students },
+        { "NumStops", config_params.num_stops },
+        { "MaxNumStudents", config_params.max_num_students },
+        { "TimerDelay", config_params.timer_delay },
+        { "GroupoffDelay", config_params.groupoff_delay },
+        { "ConductorDelay", conductor_delay },
+        { "ParentalDelay", parental_delay_and_num_couriers[0] },
+        { "NumCouriers", parental_delay_and_num_couriers[1] },
+        { "MaxStudentDelay", max_student_delay_and_trips.0 },
+        { "MaxStudentTrips", max_student_delay_and_trips.1 }
+    };
+
+
+	sout | "Different types of destination addresses";
+
+	parse_config( xstr(IN_DIR) "parseconfig-all.txt", entries, NUM_ENTRIES, parse_tabular_config_format );
+
+    sout | "Stop cost: " | config_params.stop_cost;
+    sout | "Number of students: " | config_params.num_students;
+    sout | "Number of stops: " | config_params.num_stops;
+    sout | "Maximum number of students: " | config_params.max_num_students;
+    sout | "Timer delay: " | config_params.timer_delay;
+    sout | "Groupoff delay: " | config_params.groupoff_delay;
+    sout | "Conductor delay: " | conductor_delay;
+    sout | "Parental delay: " | parental_delay_and_num_couriers[0];
+    sout | "Number of couriers: " | parental_delay_and_num_couriers[1];
+    sout | "Maximum student delay: " | max_student_delay_and_trips.0;
+    sout | "Maximum student trips: " | max_student_delay_and_trips.1;
+	sout | nl;
+
+
+	sout | "Open_Failure thrown when config file does not exist";
+	try {
+		parse_config( xstr(IN_DIR) "doesnt-exist.txt", entries, NUM_ENTRIES, parse_tabular_config_format );
+	} catch( Open_Failure * ex ) {
+		sout | "Failed to open the config file";
+	}
+	sout | nl;
+
+
+	sout | "Missing_Config_Entries thrown when config file is missing entries we want";
+	try {
+		parse_config( xstr(IN_DIR) "parseconfig-missing.txt", entries, NUM_ENTRIES, parse_tabular_config_format );
+	} catch( Missing_Config_Entries * ex ) {
+		msg( ex );
+	}
+	sout | nl;
+
+
+	sout | "Parse_Failure thrown when an entry cannot be parsed";
+
+	int non_int_val;
+	config_entry entry[1] = {
+		{ "AnothaOne", non_int_val }
+	};
+
+	try {
+		parse_config( xstr(IN_DIR) "parseconfig-errors.txt", entry, 1, parse_tabular_config_format );
+	} catch( Parse_Failure * ex ) {
+		msg( ex );
+	}
+	sout | nl;
+
+
+	sout | "Validation_Failure thrown when an entry fails validation";
+
+	// TODO: Fix compiler bug that makes casting necessary
+	config_entry new_entry1 = { "StopCost", config_params.stop_cost, (bool (*)(int &))is_positive };
+	entries[0] = new_entry1;
+
+	try {
+		parse_config( xstr(IN_DIR) "parseconfig-errors.txt", entries, NUM_ENTRIES, parse_tabular_config_format );
+	} catch( Validation_Failure * ex ) {
+		msg( ex );
+	}
+	sout | nl;
+
+
+	sout | "No error is thrown when validation succeeds";
+	config_params.stop_cost = -1; // Reset value
+	parse_config( xstr(IN_DIR) "parseconfig-all.txt", entries, NUM_ENTRIES, parse_tabular_config_format );
+	sout | "Stop cost: " | config_params.stop_cost;
+	sout | nl;
+
+
+	sout | "A custom parse function can be accepted";
+
+	config_entry new_entry2 = { "StopCost", config_params.stop_cost, custom_parse };
+	entries[0] = new_entry2;
+
+	config_params.stop_cost = -1; // Reset value
+	parse_config( xstr(IN_DIR) "parseconfig-all.txt", entries, NUM_ENTRIES, parse_tabular_config_format );
+
+	sout | "Stop cost: " | config_params.stop_cost;
+	sout | nl;
+
+
+	sout | "Custom parse and validation functions can be provided together";
+
+	// TODO: Fix compiler bug that makes casting necessary
+	config_entry new_entry3 = { "StopCost", config_params.stop_cost, custom_parse, (bool (*)(int &))is_positive };
+	entries[0] = new_entry3;
+
+	config_params.stop_cost = -1; // Reset value
+	parse_config( xstr(IN_DIR) "parseconfig-all.txt", entries, NUM_ENTRIES, parse_tabular_config_format );
+
+	sout | "Stop cost: " | config_params.stop_cost;
+
+	exit( EXIT_SUCCESS );  // This is to avoid memory leak messages from the above exceptions
+}
