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 11 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
WriteLine("if (__OriginalVTables == null)"); WriteLine("if (__OriginalVTables == null)");
WriteStartBraceIndent(); WriteStartBraceIndent();
if (Driver.Options.IsMicrosoftAbi) SaveOriginalVTablePointers(@class.Layout.VFTables);
SaveOriginalVTablePointersMS(@class);
else
SaveOriginalVTablePointersItanium();
WriteCloseBraceIndent(); WriteCloseBraceIndent();
NewLine(); NewLine();
@ -1390,22 +1387,22 @@ namespace CppSharp.Generators.CSharp
NewLine(); 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, private void AllocateNewVTablesMS(Class @class, IList<VTableComponent> entries,
IList<VTableComponent> wrappedEntries) IList<VTableComponent> wrappedEntries)
{ {
@ -1466,8 +1463,7 @@ namespace CppSharp.Generators.CSharp
private void GenerateVTableClassSetupCall(Class @class, bool addPointerGuard = false) private void GenerateVTableClassSetupCall(Class @class, bool addPointerGuard = false)
{ {
var entries = GetUniqueVTableMethodEntries(@class); if (@class.IsDynamic && GetUniqueVTableMethodEntries(@class).Count != 0)
if (@class.IsDynamic && entries.Count != 0)
{ {
// called from internal ctors which may have been passed an IntPtr.Zero // called from internal ctors which may have been passed an IntPtr.Zero
if (addPointerGuard) if (addPointerGuard)
@ -1969,7 +1965,19 @@ namespace CppSharp.Generators.CSharp
if (ShouldGenerateClassNativeField(@class)) if (ShouldGenerateClassNativeField(@class))
{ {
WriteLine("{0} = new global::System.IntPtr(native);", Helpers.InstanceIdentifier); 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 else

Loading…
Cancel
Save