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) &&