Browse Source

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>
pull/1132/head
Dimitar Dobrev 10 years ago
parent
commit
81e6ba5ea8
  1. 12
      src/Generator/Generators/CSharp/CSharpTextTemplate.cs

12
src/Generator/Generators/CSharp/CSharpTextTemplate.cs

@ -1389,7 +1389,7 @@ namespace CppSharp.Generators.CSharp @@ -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 @@ -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 @@ -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) &&

Loading…
Cancel
Save