Browse Source

Only hooked the v-tables of wrapped C++ pointers when they have virtual dtors.

Signed-off-by: Dimitar Dobrev <dpldobrev@yahoo.com>
pull/551/head
Dimitar Dobrev 10 years ago
parent
commit
289720d31b
  1. 42
      src/Generator/Generators/CSharp/CSharpTextTemplate.cs

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

@ -1348,10 +1348,7 @@ namespace CppSharp.Generators.CSharp @@ -1348,10 +1348,7 @@ namespace CppSharp.Generators.CSharp
WriteLine("if (__OriginalVTables == null)");
WriteStartBraceIndent();
if (Driver.Options.IsMicrosoftAbi)
SaveOriginalVTablePointersMS(@class);
else
SaveOriginalVTablePointersItanium();
SaveOriginalVTablePointers(@class.Layout.VFTables);
WriteCloseBraceIndent();
NewLine();
@ -1390,22 +1387,22 @@ namespace CppSharp.Generators.CSharp @@ -1390,22 +1387,22 @@ namespace CppSharp.Generators.CSharp
NewLine();
}
private void SaveOriginalVTablePointersMS(Class @class)
private void SaveOriginalVTablePointers(ICollection<VFTableInfo> vfTables)
{
WriteLine("__OriginalVTables = new void*[{0}];", @class.Layout.VFTables.Count);
if (Driver.Options.IsMicrosoftAbi)
{
WriteLine("__OriginalVTables = new void*[{0}];", vfTables.Count);
for (int i = 0; i < @class.Layout.VFTables.Count; i++)
for (var i = 0; i < vfTables.Count; i++)
WriteLine("__OriginalVTables[{0}] = native->vfptr{0}.ToPointer();", i);
}
else
{
WriteLine("__OriginalVTables[{0}] = native->vfptr{0}.ToPointer();", i);
WriteLine("__OriginalVTables = new void*[1];");
WriteLine("__OriginalVTables[0] = native->vfptr0.ToPointer();");
}
}
private void SaveOriginalVTablePointersItanium()
{
WriteLine("__OriginalVTables = new void*[1];");
WriteLine("__OriginalVTables[0] = native->vfptr0.ToPointer();");
}
private void AllocateNewVTablesMS(Class @class, IList<VTableComponent> entries,
IList<VTableComponent> wrappedEntries)
{
@ -1466,8 +1463,7 @@ namespace CppSharp.Generators.CSharp @@ -1466,8 +1463,7 @@ namespace CppSharp.Generators.CSharp
private void GenerateVTableClassSetupCall(Class @class, bool addPointerGuard = false)
{
var entries = GetUniqueVTableMethodEntries(@class);
if (@class.IsDynamic && entries.Count != 0)
if (@class.IsDynamic && GetUniqueVTableMethodEntries(@class).Count != 0)
{
// called from internal ctors which may have been passed an IntPtr.Zero
if (addPointerGuard)
@ -1969,7 +1965,19 @@ namespace CppSharp.Generators.CSharp @@ -1969,7 +1965,19 @@ namespace CppSharp.Generators.CSharp
if (ShouldGenerateClassNativeField(@class))
{
WriteLine("{0} = new global::System.IntPtr(native);", Helpers.InstanceIdentifier);
GenerateVTableClassSetupCall(@class, true);
var dtor = @class.Destructors.FirstOrDefault();
if (dtor != null && dtor.IsVirtual)
GenerateVTableClassSetupCall(@class, true);
else
{
if (@class.IsDynamic && GetUniqueVTableMethodEntries(@class).Count != 0)
{
WriteLine("if (native != null)");
WriteStartBraceIndent();
SaveOriginalVTablePointers(@class.Layout.VFTables);
WriteCloseBraceIndent();
}
}
}
}
else

Loading…
Cancel
Save