From 81e6ba5ea8d03ada46ac8de9361895c567d74667 Mon Sep 17 00:00:00 2001
From: Dimitar Dobrev <dpldobrev@yahoo.com>
Date: Sun, 11 Oct 2015 02:44:54 +0300
Subject: [PATCH] Ensured managed v-tables remain with no empty entries.

This doesn't fix any bug that I know of.
However, the patching was obviously wrong for v-tables with repetitive function pointers.
Their managed counterparts ended up with "holes" where the repetions were.

Signed-off-by: Dimitar Dobrev <dpldobrev@yahoo.com>
---
 .../Generators/CSharp/CSharpTextTemplate.cs          | 12 +++++++-----
 1 file changed, 7 insertions(+), 5 deletions(-)

diff --git a/src/Generator/Generators/CSharp/CSharpTextTemplate.cs b/src/Generator/Generators/CSharp/CSharpTextTemplate.cs
index 260c4e9b..4f2b481c 100644
--- a/src/Generator/Generators/CSharp/CSharpTextTemplate.cs
+++ b/src/Generator/Generators/CSharp/CSharpTextTemplate.cs
@@ -1389,7 +1389,7 @@ namespace CppSharp.Generators.CSharp
                     tableIndex, size, Driver.TargetInfo.PointerWidth / 8);
                 WriteLine("__ManagedVTables[{0}] = vfptr{0}.ToPointer();", tableIndex);
 
-                AllocateNewVTableEntries(@class, vfptr.Layout.Components, wrappedEntries, tableIndex);
+                AllocateNewVTableEntries(vfptr.Layout.Components, wrappedEntries, tableIndex);
             }
 
             WriteCloseBraceIndent();
@@ -1411,7 +1411,7 @@ namespace CppSharp.Generators.CSharp
             WriteLine("var vfptr0 = vtptr + {0} * {1};", offsetToTopAndRTTI, pointerSize);
             WriteLine("__ManagedVTables[0] = vfptr0.ToPointer();");
 
-            AllocateNewVTableEntries(@class, @class.Layout.Layout.Components,
+            AllocateNewVTableEntries(@class.Layout.Layout.Components,
                 wrappedEntries, tableIndex: 0);
 
             WriteCloseBraceIndent();
@@ -1420,13 +1420,15 @@ namespace CppSharp.Generators.CSharp
             WriteLine("native->vfptr0 = new IntPtr(__ManagedVTables[0]);");
         }
 
-        private void AllocateNewVTableEntries(Class @class, IEnumerable<VTableComponent> entries,
+        private void AllocateNewVTableEntries(IList<VTableComponent> entries,
             IList<VTableComponent> wrappedEntries, int tableIndex)
         {
+            const int offsetToTopAndRTTI = 2;
             var pointerSize = Driver.TargetInfo.PointerWidth / 8;
-            foreach (var entry in entries)
+            for (int i = 0; i < entries.Count; i++)
             {
-                var offsetInBytes = VTables.GetVTableComponentIndex(@class, entry) * pointerSize;
+                var entry = entries[i];
+                var offsetInBytes = (i - (Options.IsMicrosoftAbi ? 0 : offsetToTopAndRTTI)) * pointerSize;
 
                 if ((entry.Kind == VTableComponentKind.FunctionPointer ||
                      entry.Kind == VTableComponentKind.DeletingDtorPointer) &&