From 03f610f528747f4b43c5ecf161e04861b3e2d07d Mon Sep 17 00:00:00 2001
From: triton <joao@tritao.eu>
Date: Tue, 8 Sep 2015 01:06:02 +0100
Subject: [PATCH] Factor the saving of original vtables pointers to its method.

---
 .../Generators/CSharp/CSharpTextTemplate.cs   | 39 ++++++++++++-------
 1 file changed, 25 insertions(+), 14 deletions(-)

diff --git a/src/Generator/Generators/CSharp/CSharpTextTemplate.cs b/src/Generator/Generators/CSharp/CSharpTextTemplate.cs
index 0d3f680b..1c234e53 100644
--- a/src/Generator/Generators/CSharp/CSharpTextTemplate.cs
+++ b/src/Generator/Generators/CSharp/CSharpTextTemplate.cs
@@ -1324,9 +1324,33 @@ namespace CppSharp.Generators.CSharp
             PopBlock(NewLineKind.BeforeNextBlock);
         }
 
+        private void GenerateSaveOriginalVTables(Class @class)
+        {
+            WriteLine("void SaveOriginalVTables(global::System.IntPtr instance)");
+            WriteStartBraceIndent();
+
+            WriteLine("var native = (Internal*)instance.ToPointer();");
+            NewLine();
+
+            WriteLine("if (__OriginalVTables == null)");
+            WriteStartBraceIndent();
+
+            if (Options.IsMicrosoftAbi)
+                SaveOriginalVTablePointersMS(@class);
+            else
+                SaveOriginalVTablePointersItanium();
+
+            WriteCloseBraceIndent();
+
+            WriteCloseBraceIndent();
+            NewLine();
+        }
+
         private void GenerateVTableClassSetup(Class @class, string dictionary,
             IList<VTableComponent> entries, IList<VTableComponent> wrappedEntries)
         {
+            GenerateSaveOriginalVTables(@class);
+
             WriteLine("void SetupVTables(global::System.IntPtr instance)");
             WriteStartBraceIndent();
 
@@ -1345,20 +1369,7 @@ namespace CppSharp.Generators.CSharp
             NewLine();
 
             // Save the original vftable pointers.
-            WriteLine("if (__OriginalVTables == null)");
-            WriteStartBraceIndent();
-
-            switch (Driver.Options.Abi)
-            {
-                case CppAbi.Microsoft:
-                    SaveOriginalVTablePointersMS(@class);
-                    break;
-                case CppAbi.Itanium:
-                case CppAbi.ARM:
-                    SaveOriginalVTablePointersItanium();
-                    break;
-            }
-            WriteCloseBraceIndent();
+            WriteLine("SaveOriginalVTables(instance);");
             NewLine();
 
             // Get the _Thunks