Index: doc/working/exception/impl/except.c
===================================================================
--- doc/working/exception/impl/except.c	(revision 4a58895262c2c4bd3d0eed6c3185dd9f2b78c7b0)
+++ doc/working/exception/impl/except.c	(revision c77fd8be5ec10e874c647e1154739966d1debc6c)
@@ -4,4 +4,10 @@
 
 #include "lsda.h"
+
+// This macro should be the only thing that needs to change across machines.
+// struct _Unwind_Context * -> _Unwind_Reason_Code(*)()
+#define MATCHER_FROM_CONTEXT(ptr_to_context) \
+	(*(_Unwind_Reason_Code(**)())(_Unwind_GetCFA(ptr_to_context) + 8))
+
 
 //Global which defines the current exception
@@ -17,4 +23,6 @@
                      struct _Unwind_Exception* unwind_exception, struct _Unwind_Context* context)
 {
+	printf("CFA: 0x%lx\n", _Unwind_GetCFA(context));
+
 	//DEBUG
 	printf("Personality function (%d, %x, %llu, %p, %p):", version, actions, exceptionClass, unwind_exception, context);
@@ -111,5 +119,8 @@
 
 					//Get a function pointer from the relative offset and call it
-					_Unwind_Reason_Code (*matcher)() = (_Unwind_Reason_Code (*)())lsd_info.LPStart + imatcher;					
+					// _Unwind_Reason_Code (*matcher)() = (_Unwind_Reason_Code (*)())lsd_info.LPStart + imatcher;					
+
+					_Unwind_Reason_Code (*matcher)() =
+						MATCHER_FROM_CONTEXT(context);
 					_Unwind_Reason_Code ret = matcher();
 
Index: doc/working/exception/impl/main.c
===================================================================
--- doc/working/exception/impl/main.c	(revision 4a58895262c2c4bd3d0eed6c3185dd9f2b78c7b0)
+++ doc/working/exception/impl/main.c	(revision c77fd8be5ec10e874c647e1154739966d1debc6c)
@@ -1,4 +1,6 @@
 #include <stdio.h>
 #include "except.h"
+
+// Requires -fexceptions to work.
 
 #define EXCEPTION 2
@@ -26,5 +28,6 @@
 extern int this_exception;
 _Unwind_Reason_Code foo_try_match() {
-	return this_exception == 3 ? _URC_HANDLER_FOUND : _URC_CONTINUE_UNWIND;
+	printf(" (foo_try_match called)");
+	return this_exception == EXCEPTION ? _URC_HANDLER_FOUND : _URC_CONTINUE_UNWIND;
 }
 
@@ -34,6 +37,10 @@
 //for details
 __attribute__((noinline))
-void try( void (*try_block)(), void (*catch_block)() )
+void try( void (*try_block)(), void (*catch_block)(),
+          _Unwind_Reason_Code (*match_block)() )
 {
+	volatile int xy = 0;
+	printf("%p %p %p %p\n", &try_block, &catch_block, &match_block, &xy);
+
 	//Setup statments
 	//These 2 statments won't actually result in any code,
@@ -95,6 +102,4 @@
 	"	.uleb128 .CATCH-try\n"				//Hanlder landing pad adress  (relative to start of function)
 	"	.uleb128 1\n"						//Action code, gcc seems to use always 0
-	//Beyond this point we don't match gcc data'
-	"	.uleb128 foo_try_match-try\n"			//Handler routine to check if the exception is matched
 	".LLSDACSECFA2:\n"						//BODY end
 	"	.text\n"							//TABLE footer
@@ -122,13 +127,64 @@
 
 	//Actual call to the try block
-	try( foo_try_block, foo_catch_block );
+	try( foo_try_block, foo_catch_block, foo_try_match );
 
 	printf( "Foo exited normally\n" );
 }
 
+// Not in main.cfa
+void fy() {
+	// Currently not destroyed if the exception is caught in fee.
+	raii_t a = { "Fy dtor" };
+
+	void fy_try_block() {
+		raii_t b = { "Fy try dtor" };
+
+		throw( 3 );
+	}
+
+	void fy_catch_block() {
+		printf("Fy caught exception\n");
+	}
+
+	_Unwind_Reason_Code fy_match_block() {
+		return this_exception == 2 ? _URC_HANDLER_FOUND : _URC_CONTINUE_UNWIND;
+	}
+
+	try(fy_try_block, fy_catch_block, fy_match_block);
+
+	printf( "Fy exited normally\n" );
+}
+
+void fee() {
+	raii_t a = { "Fee dtor" };
+
+	void fee_try_block() {
+		raii_t b = { "Fee try dtor" };
+
+		fy();
+
+		printf("fy returned\n");
+	}
+
+	void fee_catch_block() {
+		printf("Fee caught exception\n");
+	}
+
+	_Unwind_Reason_Code fee_match_block() {
+		return this_exception == 3 ? _URC_HANDLER_FOUND : _URC_CONTINUE_UNWIND;
+	}
+
+	try(fee_try_block, fee_catch_block, fee_match_block);
+
+	printf( "Fee exited normally\n" );
+}
+// End not in main.cfa
+
 int main() {
 	raii_t a = { "Main dtor" };
 
-	for (unsigned int i = 0 ; i < 100000000 ; ++i) foo();
+	//for (unsigned int i = 0 ; i < 100000000 ; ++i)
+	foo();
+	fee();
 
 	printf("End of program reached\n");
