Index: src/ControlStruct/ExceptTranslate.cc
===================================================================
--- src/ControlStruct/ExceptTranslate.cc	(revision 1abc5ab5b96dec46ebfe0132b1fc3d15eddea566)
+++ src/ControlStruct/ExceptTranslate.cc	(revision 307a732f5fa4b97b19f405fc215fcd76f473e3a1)
@@ -10,5 +10,5 @@
 // Created On       : Wed Jun 14 16:49:00 2017
 // Last Modified By : Andrew Beach
-// Last Modified On : Thr Jun 29 15:18:00 2017
+// Last Modified On : Fri Jun 30 13:30:00 2017
 // Update Count     : 1
 //
@@ -22,5 +22,5 @@
 #include "SynTree/Attribute.h"
 
-namespace ControlFlow {
+namespace ControlStruct {
 
 	// This (large) section could probably be moved out of the class
@@ -29,6 +29,6 @@
 	// Type(Qualifiers &, false, std::list<Attribute *> &)
 
-	// void (*function)()
-	static FunctionType void_func_t(Type::Qualifiers(), false);
+	// void (*function)();
+	static FunctionType try_func_t(Type::Qualifiers(), false);
 	// void (*function)(int, exception);
 	static FunctionType catch_func_t(Type::Qualifiers(), false);
@@ -37,4 +37,6 @@
 	// bool (*function)(exception);
 	static FunctionType handle_func_t(Type::Qualifiers(), false);
+	// void (*function)(__attribute__((unused)) void *);
+	static FunctionType finally_func_t(Type::Qualifiers(), false);
 
 	static void init_func_types() {
@@ -48,7 +50,7 @@
 			LinkageSpec::Cforall,
 			/*bitfieldWidth*/ NULL,
-			new BasicType(emptyQualifiers, BasicType::UnsignedInt),
+			new BasicType( emptyQualifiers, BasicType::SignedInt ),
 			/*init*/ NULL
-		);
+			);
 		ObjectDecl exception_obj(
 			"__exception_inst",
@@ -56,7 +58,10 @@
 			LinkageSpec::Cforall,
 			/*bitfieldWidth*/ NULL,
-			new BasicType(emptyQualifiers, BasicType::UnsignedInt),
+			new PointerType(
+				emptyQualifiers,
+				new BasicType( emptyQualifiers, BasicType::SignedInt )
+				),
 			/*init*/ NULL
-		);
+			);
 		ObjectDecl bool_obj(
 			"__ret_bool",
@@ -66,12 +71,27 @@
 			new BasicType(emptyQualifiers, BasicType::Bool),
 			/*init*/ NULL
-		);
-
-		catch_func_t.get_parameters().push_back(index_obj.clone());
-		catch_func_t.get_parameters().push_back(exception_obj.clone());
-		match_func_t.get_returnVals().push_back(index_obj.clone());
-		match_func_t.get_parameters().push_back(exception_obj.clone());
-		handle_func_t.get_returnVals().push_back(bool_obj.clone());
-		handle_func_t.get_parameters().push_back(exception_obj.clone());
+			);
+		ObjectDecl voidptr_obj(
+			"__hook",
+			Type::StorageClasses(),
+			LinkageSpec::Cforall,
+			NULL,
+			new PointerType(
+				emptyQualifiers,
+				new VoidType(
+					emptyQualifiers
+					),
+				std::list<Attribute *>{new Attribute("unused")}
+				),
+			NULL
+			);
+
+		catch_func_t.get_parameters().push_back( index_obj.clone() );
+		catch_func_t.get_parameters().push_back( exception_obj.clone() );
+		match_func_t.get_returnVals().push_back( index_obj.clone() );
+		match_func_t.get_parameters().push_back( exception_obj.clone() );
+		handle_func_t.get_returnVals().push_back( bool_obj.clone() );
+		handle_func_t.get_parameters().push_back( exception_obj.clone() );
+		finally_func_t.get_parameters().push_back( voidptr_obj.clone() );
 
 		init_complete = true;
@@ -114,13 +134,28 @@
 	// ThrowStmt Mutation Helpers
 
-	Statement * create_terminate_throw( ThrowStmt *throwStmt ) {
-		// __throw_terminate( EXPR );
-		UntypedExpr * call = new UntypedExpr( new NameExpr(
-			"__cfaehm__throw_termination" ) );
-		call->get_args().push_back( throwStmt->get_expr() );
-		Statement * result = new ExprStmt( throwStmt->get_labels(), call );
+	Statement * create_given_throw(
+			const char * throwFunc, ThrowStmt * throwStmt ) {
+		// { int NAME = EXPR; throwFunc( &NAME ); }
+		CompoundStmt * result = new CompoundStmt( noLabels );
+		ObjectDecl * local = new ObjectDecl(
+			"__local_exception_copy",
+			Type::StorageClasses(),
+			LinkageSpec::Cforall,
+			NULL,
+			new BasicType( emptyQualifiers, BasicType::SignedInt ),
+			new SingleInit( throwStmt->get_expr() )
+			);
+		appendDeclStmt( result, local );
+		UntypedExpr * call = new UntypedExpr( new NameExpr( throwFunc ) );
+		call->get_args().push_back( new AddressExpr( nameOf( local ) ) );
+		result->push_back( new ExprStmt( throwStmt->get_labels(), call ) );
 		throwStmt->set_expr( nullptr );
 		delete throwStmt;
 		return result;
+	}
+
+	Statement * create_terminate_throw( ThrowStmt *throwStmt ) {
+		// { int NAME = EXPR; __throw_terminate( &NAME ); }
+		return create_given_throw( "__cfaehm__throw_termination", throwStmt );
 	}
 	Statement * create_terminate_rethrow( ThrowStmt *throwStmt ) {
@@ -136,11 +171,5 @@
 	Statement * create_resume_throw( ThrowStmt *throwStmt ) {
 		// __throw_resume( EXPR );
-		UntypedExpr * call = new UntypedExpr( new NameExpr(
-			"__cfaehm__throw_resumption" ) );
-		call->get_args().push_back( throwStmt->get_expr() );
-		Statement * result = new ExprStmt( throwStmt->get_labels(), call );
-		throwStmt->set_expr( nullptr );
-		delete throwStmt;
-		return result;
+		return create_given_throw( "__cfaehm__throw_resumption", throwStmt );
 	}
 	Statement * create_resume_rethrow( ThrowStmt *throwStmt ) {
@@ -164,5 +193,5 @@
 
 		return new FunctionDecl( "try", Type::StorageClasses(),
-			LinkageSpec::Cforall, void_func_t.clone(), body );
+			LinkageSpec::Cforall, try_func_t.clone(), body );
 	}
 
@@ -235,5 +264,11 @@
 			std::list<Expression *> args;
 			args.push_back( number );
-			args.push_back( nameOf( except_obj ) );
+
+			std::list<Expression *> rhs_args;
+			rhs_args.push_back( nameOf( except_obj ) );
+			Expression * rhs = new UntypedExpr(
+				new NameExpr( "*?" ), rhs_args );
+			args.push_back( rhs );
+
 			cond = new UntypedExpr( new NameExpr( "?==?" /*???*/), args );
 		}
@@ -276,4 +311,7 @@
 			*it = nullptr;
 		}
+
+		body->push_back( new ReturnStmt( noLabels, new ConstantExpr(
+			Constant::from_int( 0 ) ) ) );
 
 		return new FunctionDecl("match", Type::StorageClasses(),
@@ -364,5 +402,5 @@
 		UntypedExpr *setup = new UntypedExpr( new NameExpr(
 			"__cfaehm__try_resume_setup" ) );
-		setup->get_args().push_back( nameOf( obj ) );
+		setup->get_args().push_back( new AddressExpr( nameOf( obj ) ) );
 		setup->get_args().push_back( nameOf( resume_handler ) );
 
@@ -381,5 +419,5 @@
 
 		return new FunctionDecl("finally", Type::StorageClasses(),
-			LinkageSpec::Cforall, void_func_t.clone(), body);
+			LinkageSpec::Cforall, finally_func_t.clone(), body);
 	}
 
Index: src/ControlStruct/ExceptTranslate.h
===================================================================
--- src/ControlStruct/ExceptTranslate.h	(revision 1abc5ab5b96dec46ebfe0132b1fc3d15eddea566)
+++ src/ControlStruct/ExceptTranslate.h	(revision 307a732f5fa4b97b19f405fc215fcd76f473e3a1)
@@ -10,6 +10,6 @@
 // Created On       : Tus Jun 06 10:13:00 2017
 // Last Modified By : Andrew Beach
-// Last Modified On : Thr Jun 29 15:18:00 2017
-// Update Count     : 1
+// Last Modified On : Fri Jun 30 10:20:00 2017
+// Update Count     : 2
 //
 
@@ -20,5 +20,5 @@
 #include "SynTree/SynTree.h"
 
-namespace ControlFlow {
+namespace ControlStruct {
 	void translateEHM( std::list< Declaration *> & translationUnit );
 	/* Converts exception handling structures into their underlying C code.
