Index: doc/theses/andrew_beach_MMath/code/.gitignore
===================================================================
--- doc/theses/andrew_beach_MMath/code/.gitignore	(revision 63e3ed80ef51c55ad2d5abab847cc1ee9a02ed19)
+++ doc/theses/andrew_beach_MMath/code/.gitignore	(revision 63e3ed80ef51c55ad2d5abab847cc1ee9a02ed19)
@@ -0,0 +1,7 @@
+# Ignore everything that doesn't have a dot in its name.
+# (These are the generated executables.)
+/*
+!/*.*
+
+# Java Executables:
+*.class
Index: doc/theses/andrew_beach_MMath/code/cond_catch.py
===================================================================
--- doc/theses/andrew_beach_MMath/code/cond_catch.py	(revision 63e3ed80ef51c55ad2d5abab847cc1ee9a02ed19)
+++ doc/theses/andrew_beach_MMath/code/cond_catch.py	(revision 63e3ed80ef51c55ad2d5abab847cc1ee9a02ed19)
@@ -0,0 +1,47 @@
+#!/usr/bin/env python3
+
+# Conditional Match (or Re-Raise)
+
+from time import thread_time_ns
+
+
+class EmptyException(Exception):
+    pass
+
+
+should_catch = False
+
+
+def throw_exception():
+    raise EmptyException()
+
+
+def cond_catch():
+    try:
+        throw_exception()
+    except EmptyException as exc:
+        if not should_catch:
+            raise
+
+
+def main(argv):
+    times = 1
+    if 1 < len(argv):
+        times = int(argv[1])
+    if 2 < len(argv):
+        should_catch = 0 < int(argv[2])
+
+    start_time = thread_time_ns()
+    for count in range(times):
+        try:
+            cond_catch();
+        except EmptyException:
+            pass
+
+    end_time = thread_time_ns()
+    print('Run-Time (ns):', end_time - start_time)
+
+
+if '__main__' == __name__:
+    import sys
+    main(sys.argv)
Index: doc/theses/andrew_beach_MMath/code/cross_catch.py
===================================================================
--- doc/theses/andrew_beach_MMath/code/cross_catch.py	(revision 63e3ed80ef51c55ad2d5abab847cc1ee9a02ed19)
+++ doc/theses/andrew_beach_MMath/code/cross_catch.py	(revision 63e3ed80ef51c55ad2d5abab847cc1ee9a02ed19)
@@ -0,0 +1,30 @@
+#!/usr/bin/env python3
+
+# Cross a Try Statement with a Termination Handler
+
+from time import thread_time_ns
+
+
+class NotRaisedException(Exception):
+    pass
+
+
+def main(argv):
+    times = 1;
+    if 1 < len(argv):
+        times = int(argv[1])
+
+    start_time = thread_time_ns()
+    for count in range(times):
+        try:
+            pass
+        except NotRaisedException:
+            pass
+
+    end_time = thread_time_ns()
+    print('Run-Time (ns):', end_time - start_time)
+
+
+if '__main__' == __name__:
+    import sys
+    main(sys.argv)
Index: doc/theses/andrew_beach_MMath/code/cross_finally.py
===================================================================
--- doc/theses/andrew_beach_MMath/code/cross_finally.py	(revision 63e3ed80ef51c55ad2d5abab847cc1ee9a02ed19)
+++ doc/theses/andrew_beach_MMath/code/cross_finally.py	(revision 63e3ed80ef51c55ad2d5abab847cc1ee9a02ed19)
@@ -0,0 +1,29 @@
+#!/usr/bin/env python3
+
+# Cross a Try Statement With Finally Clause
+
+from time import thread_time_ns
+
+
+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])
+
+    start_time = thread_time_ns()
+    for count in range(times):
+        try:
+            pass
+        finally:
+            pass
+
+    end_time = thread_time_ns()
+    print('Run-Time (ns):', end_time - start_time)
+
+
+if '__main__' == __name__:
+    import sys
+    main(sys.argv)
Index: doc/theses/andrew_beach_MMath/code/test.sh
===================================================================
--- doc/theses/andrew_beach_MMath/code/test.sh	(revision 9f77301aef8274700a61696fe1aafca8aad81323)
+++ doc/theses/andrew_beach_MMath/code/test.sh	(revision 63e3ed80ef51c55ad2d5abab847cc1ee9a02ed19)
@@ -18,8 +18,8 @@
 	*.cfa)
 		# Requires a symbolic link.
-		mmake "${1%.cfa}" "$1" ./cfa "$1" -o "${1%.cfa}"
+		mmake "${1%.cfa}" "$1" ./cfa -DNDEBUG -nodebug -O3 "$1" -o "${1%.cfa}"
 		;;
 	*.cpp)
-		mmake "${1%.cpp}-cpp" "$1" g++ "$1" -o "${1%.cpp}-cpp"
+		mmake "${1%.cpp}-cpp" "$1" g++ -DNDEBUG -O3 "$1" -o "${1%.cpp}-cpp"
 		;;
 	*.java)
@@ -39,9 +39,9 @@
 	exit 0
 elif [ 2 -eq "$#" ]; then
-    TEST_LANG="$1"
-    TEST_CASE="$2"
+	TEST_LANG="$1"
+	TEST_CASE="$2"
 else
-    echo "Unknown call pattern." >&2
-    exit 2
+	echo "Unknown call pattern." >&2
+	exit 2
 fi
 
@@ -58,4 +58,5 @@
 	CPP="./cond-catch-cpp $ITERATIONS 1"
 	JAVA="java CondCatch $ITERATIONS 1"
+	PYTHON="./cond_catch.py $ITERATIONS 1"
 	;;
 cond-match-none)
@@ -64,4 +65,5 @@
 	CPP="./cond-catch-cpp $ITERATIONS 0"
 	JAVA="java CondCatch $ITERATIONS 0"
+	PYTHON="./cond_catch.py $ITERATIONS 0"
 	;;
 cross-catch)
@@ -70,4 +72,5 @@
 	CPP="./cross-catch-cpp $ITERATIONS"
 	JAVA="java CrossCatch $ITERATIONS"
+	PYTHON="./cross_catch.py $ITERATIONS"
 	;;
 cross-finally)
@@ -76,4 +79,5 @@
 	CPP=unsupported
 	JAVA="java CrossFinally $ITERATIONS"
+	PYTHON="./cross_finally.py $ITERATIONS"
 	;;
 raise-detor)
@@ -82,4 +86,5 @@
 	CPP="./throw-detor-cpp $ITERATIONS $STACK_HEIGHT"
 	JAVA=unsupported
+	PYTHON=unsupported
 	;;
 raise-empty)
@@ -88,4 +93,5 @@
 	CPP="./throw-empty-cpp $ITERATIONS $STACK_HEIGHT"
 	JAVA="java ThrowEmpty $ITERATIONS $STACK_HEIGHT"
+	PYTHON="./throw_empty.py $ITERATIONS $STACK_HEIGHT"
 	;;
 raise-finally)
@@ -94,4 +100,5 @@
 	CPP=unsupported
 	JAVA="java ThrowFinally $ITERATIONS $STACK_HEIGHT"
+	PYTHON="./throw_finally.py $ITERATIONS $STACK_HEIGHT"
 	;;
 raise-other)
@@ -100,4 +107,5 @@
 	CPP="./throw-other-cpp $ITERATIONS $STACK_HEIGHT"
 	JAVA="java ThrowOther $ITERATIONS $STACK_HEIGHT"
+	PYTHON="./throw_other.py $ITERATIONS $STACK_HEIGHT"
 	;;
 *)
@@ -112,6 +120,8 @@
 cpp) echo $CPP; $CPP;;
 java) echo $JAVA; $JAVA;;
+python) echo $PYTHON; $PYTHON;;
 *)
 	echo "No such language: $TEST_LANG" >&2
 	exit 2
+	;;
 esac
Index: doc/theses/andrew_beach_MMath/code/throw_empty.py
===================================================================
--- doc/theses/andrew_beach_MMath/code/throw_empty.py	(revision 63e3ed80ef51c55ad2d5abab847cc1ee9a02ed19)
+++ doc/theses/andrew_beach_MMath/code/throw_empty.py	(revision 63e3ed80ef51c55ad2d5abab847cc1ee9a02ed19)
@@ -0,0 +1,40 @@
+#!/usr/bin/env python3
+
+# Throw Across Empty Function
+
+from time import thread_time_ns
+
+
+class EmptyException(Exception):
+    pass
+
+
+def unwind_empty(frames):
+    if 0 < frames:
+        unwind_empty(frames - 1)
+    else:
+        raise EmptyException()
+
+
+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])
+
+    start_time = thread_time_ns()
+    for count in range(times):
+        try:
+            unwind_empty(total_frames)
+        except EmptyException:
+            pass
+
+    end_time = thread_time_ns()
+    print('Run-Time (ns):', end_time - start_time)
+
+
+if '__main__' == __name__:
+    import sys
+    main(sys.argv)
Index: doc/theses/andrew_beach_MMath/code/throw_finally.py
===================================================================
--- doc/theses/andrew_beach_MMath/code/throw_finally.py	(revision 63e3ed80ef51c55ad2d5abab847cc1ee9a02ed19)
+++ doc/theses/andrew_beach_MMath/code/throw_finally.py	(revision 63e3ed80ef51c55ad2d5abab847cc1ee9a02ed19)
@@ -0,0 +1,43 @@
+#!/usr/bin/env python3
+
+# Throw Across Finally
+
+from time import thread_time_ns
+
+
+class EmptyException(Exception):
+    pass
+
+
+def unwind_finally(frames):
+    if 0 < frames:
+        try:
+            unwind_finally(frames - 1)
+        finally:
+            pass
+    else:
+        raise EmptyException()
+
+
+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])
+
+    start_time = thread_time_ns()
+    for count in range(times):
+        try:
+            unwind_finally(total_frames)
+        except EmptyException:
+            pass
+
+    end_time = thread_time_ns()
+    print('Run-Time (ns):', end_time - start_time)
+
+
+if '__main__' == __name__:
+    import sys
+    main(sys.argv)
Index: doc/theses/andrew_beach_MMath/code/throw_other.py
===================================================================
--- doc/theses/andrew_beach_MMath/code/throw_other.py	(revision 63e3ed80ef51c55ad2d5abab847cc1ee9a02ed19)
+++ doc/theses/andrew_beach_MMath/code/throw_other.py	(revision 63e3ed80ef51c55ad2d5abab847cc1ee9a02ed19)
@@ -0,0 +1,47 @@
+#!/usr/bin/env python3
+
+# Throw Across Other Handler
+
+from time import thread_time_ns
+
+
+class EmptyException(Exception):
+    pass
+
+
+class NotRaisedException(Exception):
+    pass
+
+
+def unwind_other(frames):
+    if 0 < frames:
+        try:
+            unwind_other(frames - 1)
+        except NotRaisedException:
+            pass
+    else:
+        raise EmptyException()
+
+
+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])
+
+    start_time = thread_time_ns()
+    for count in range(times):
+        try:
+            unwind_other(total_frames)
+        except EmptyException:
+            pass
+
+    end_time = thread_time_ns()
+    print('Run-Time (ns):', end_time - start_time)
+
+
+if '__main__' == __name__:
+    import sys
+    main(sys.argv)
Index: doc/theses/andrew_beach_MMath/code/throw_with.py
===================================================================
--- doc/theses/andrew_beach_MMath/code/throw_with.py	(revision 63e3ed80ef51c55ad2d5abab847cc1ee9a02ed19)
+++ doc/theses/andrew_beach_MMath/code/throw_with.py	(revision 63e3ed80ef51c55ad2d5abab847cc1ee9a02ed19)
@@ -0,0 +1,50 @@
+#!/usr/bin/env python3
+
+# Throw Across With Statement (closest thing Python has to a destructor)
+
+from time import thread_time_ns
+
+
+class EmptyException(Exception):
+    pass
+
+
+class EmptyContextManager:
+
+    def __enter__(self):
+        pass
+
+    def __exit__(self, exception_type, exception_value, traceback):
+        pass
+
+
+def unwind_with(frames):
+    if 0 < frames:
+        with EmptyContextManager():
+            unwind_with(frames - 1)
+    else:
+        raise EmptyException()
+
+
+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])
+
+    start_time = thread_time_ns()
+    for count in range(times):
+        try:
+            unwind_with(total_frames)
+        except EmptyException:
+            pass
+
+    end_time = thread_time_ns()
+    print('Run-Time (ns):', end_time - start_time)
+
+
+if '__main__' == __name__:
+    import sys
+    main(sys.argv)
