Index: src/ControlStruct/ExceptTranslate.cc
===================================================================
--- src/ControlStruct/ExceptTranslate.cc	(revision 948b0c88a7ab5802aa0c7916d51ded5b52a2017d)
+++ src/ControlStruct/ExceptTranslate.cc	(revision f196351459b11bf18eaef663d78e23d30f044ddd)
@@ -10,5 +10,5 @@
 // Created On       : Wed Jun 14 16:49:00 2017
 // Last Modified By : Andrew Beach
-// Last Modified On : Wed Aug 02 12:09:00 2017
+// Last Modified On : Tus Aug  8 16:54:00 2017
 // Update Count     : 7
 //
@@ -116,7 +116,5 @@
 			handle_func_t( noQualifiers, false ),
 			finally_func_t( noQualifiers, false )
-		{
-			init_func_types();
-		}
+		{}
 
 		void premutate( CatchStmt *catchStmt );
@@ -127,4 +125,6 @@
 
 	void ExceptionMutatorCore::init_func_types() {
+		assert( except_decl );
+
 		ObjectDecl index_obj(
 			"__handler_index",
@@ -142,6 +142,5 @@
 			new PointerType(
 				noQualifiers,
-				//new StructInstType( noQualifiers, except_decl )
-				new BasicType( noQualifiers, BasicType::SignedInt )
+				new StructInstType( noQualifiers, except_decl )
 				),
 			/*init*/ NULL
@@ -183,28 +182,15 @@
 	Statement * ExceptionMutatorCore::create_given_throw(
 			const char * throwFunc, ThrowStmt * throwStmt ) {
-		// There is an extra copy here we might be able to remove with
-		// references.
-		// { int NAME = EXPR; throwFunc( &NAME ); }
-		CompoundStmt * result = new CompoundStmt( noLabels );
-		ObjectDecl * local = new ObjectDecl(
-			"__local_exception_copy",
-			Type::StorageClasses(),
-			LinkageSpec::Cforall,
-			NULL,
-			new BasicType( noQualifiers, BasicType::SignedInt ),
-			new SingleInit( throwStmt->get_expr() )
-			);
-		appendDeclStmt( result, local );
+		// `throwFunc`( `throwStmt->get_name` );
 		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 ) );
+		call->get_args().push_back( throwStmt->get_expr() );
 		throwStmt->set_expr( nullptr );
 		delete throwStmt;
-		return result;
+		return new ExprStmt( noLabels, call );
 	}
 
 	Statement * ExceptionMutatorCore::create_terminate_throw(
 			ThrowStmt *throwStmt ) {
-		// { int NAME = EXPR; __throw_terminate( &NAME ); }
+		// __throw_terminate( `throwStmt->get_name()` ); }
 		return create_given_throw( "__cfaehm__throw_terminate", throwStmt );
 	}
@@ -236,5 +222,5 @@
 	Statement * ExceptionMutatorCore::create_resume_throw(
 			ThrowStmt *throwStmt ) {
-		// __throw_resume( EXPR );
+		// __throw_resume( `throwStmt->get_name` );
 		return create_given_throw( "__cfaehm__throw_resume", throwStmt );
 	}
@@ -253,5 +239,4 @@
 	// TryStmt Mutation Helpers
 
-	// XXX: Leave out?
 	CompoundStmt * ExceptionMutatorCore::take_try_block( TryStmt *tryStmt ) {
 		CompoundStmt * block = tryStmt->get_block();
@@ -282,21 +267,4 @@
 			CatchStmt * handler = *it;
 
-			// INTEGERconstant Version
-			// case `index`:
-			// {
-			//     `handler.decl` {inserted} = { except_obj };
-			//     `handler.body`
-			// }
-			// return;
-			CompoundStmt * block = new CompoundStmt( noLabels );
-
-			// Just copy the exception value. (Post Validation)
-			ObjectDecl * handler_decl =
-				static_cast<ObjectDecl *>( handler->get_decl() );
-			ObjectDecl * local_except = handler_decl->clone();
-			local_except->set_init(
-				new ListInit({ new SingleInit( nameOf( except_obj ) ) }) );
-#if 0
-			// Virtual Exception Vision
 			// case `index`:
 			// {
@@ -305,6 +273,10 @@
 			// }
 			// return;
-
-			// Save a cast copy of the exception (should always succeed).
+			CompoundStmt * block = new CompoundStmt( noLabels );
+
+			// Just copy the exception value. (Post Validation)
+			ObjectDecl * handler_decl =
+				static_cast<ObjectDecl *>( handler->get_decl() );
+			ObjectDecl * local_except = handler_decl->clone();
 			local_except->set_init(
 				new ListInit({ new SingleInit(
@@ -314,5 +286,4 @@
 					) })
 				);
-#endif
 			block->push_back( new DeclStmt( noLabels, local_except ) );
 
@@ -366,19 +337,19 @@
 	CompoundStmt * ExceptionMutatorCore::create_single_matcher(
 			DeclarationWithType * except_obj, CatchStmt * modded_handler ) {
+		// {
+		//     `modded_handler.decl`
+		//     if ( `decl.name = (virtual `decl.type`)`except`
+		//             [&& `modded_handler.cond`] ) {
+		//         `modded_handler.body`
+		//     }
+		// }
+
 		CompoundStmt * block = new CompoundStmt( noLabels );
 
+		// Local Declaration
 		ObjectDecl * local_except =
 			dynamic_cast<ObjectDecl *>( modded_handler->get_decl() );
 		assert( local_except );
 		block->push_back( new DeclStmt( noLabels, local_except ) );
-#if 0
-		// Virtual Exception Version
-		// {
-		//     `modded_handler.decl`
-		//     if ( `decl.name = (virtual)`except`
-		//             [&& `modded_handler.cond`] ) {
-		//         `modded_handler.body`
-		//     }
-		// }
 
 		// Check for type match.
@@ -386,31 +357,4 @@
 			new VirtualCastExpr( nameOf( except_obj ),
 				local_except->get_type()->clone() ) );
-#endif
-
-		// INTEGERconstant Version
-		// {
-		//     `modded_handler.decl` = *`except`
-		//     if ( `decl.name` == `modded_handler.cond` ) {
-		//         `modded_handler.body`
-		//     }
-		// }
-		ConstantExpr * number =
-			dynamic_cast<ConstantExpr*>( modded_handler->get_cond() );
-		assert( number );
-		modded_handler->set_cond( nullptr );
-
-		Expression * cond;
-		{
-			std::list<Expression *> args;
-			args.push_back( number );
-
-			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 );
-		}
 
 		// Add the check on the conditional if it is provided.
@@ -607,20 +551,4 @@
 	// Visiting/Mutating Functions
 	void ExceptionMutatorCore::premutate( CatchStmt *catchStmt ) {
-		// Currently, we make up the declaration, as there isn't one for
-		// integers.
-		assert( ! catchStmt->get_decl() );
-		ObjectDecl * tmp = new ObjectDecl(
-			"_hidden_local",
-			Type::StorageClasses(),
-			LinkageSpec::Cforall,
-			nullptr,
-			new PointerType(
-				noQualifiers,
-				new BasicType( noQualifiers, BasicType::SignedInt )
-				),
-			nullptr
-			);
-		catchStmt->set_decl( tmp );
-
 		// Validate the Statement's form.
 		ObjectDecl * decl =
@@ -650,4 +578,8 @@
 			// Skip children?
 			return;
+		} else if ( structDecl->get_name() == "__cfaehm__base_exception_t" ) {
+			assert( nullptr == except_decl );
+			except_decl = structDecl;
+			init_func_types();
 		} else if ( structDecl->get_name() == "__cfaehm__try_resume_node" ) {
 			assert( nullptr == node_decl );
@@ -661,4 +593,6 @@
 
 	Statement * ExceptionMutatorCore::postmutate( ThrowStmt *throwStmt ) {
+		assert( except_decl );
+
 		// Ignoring throwStmt->get_target() for now.
 		if ( ThrowStmt::Terminate == throwStmt->get_kind() ) {
@@ -688,4 +622,5 @@
 
 	Statement * ExceptionMutatorCore::postmutate( TryStmt *tryStmt ) {
+		assert( except_decl );
 		assert( node_decl );
 		assert( hook_decl );
