Browse Source

Properly set virtual tables up in the internal ctor by pointer.

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

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

@ -1438,7 +1438,7 @@ namespace CppSharp.Generators.CSharp @@ -1438,7 +1438,7 @@ namespace CppSharp.Generators.CSharp
private void GenerateVTableClassSetupCall(Class @class)
{
if (@class.IsDynamic && GetUniqueVTableMethodEntries(@class).Count != 0)
if (@class.IsDynamic && GetUniqueVTableMethodEntries(@class).Count > 0)
WriteLine("SetupVTables();");
}
@ -1901,40 +1901,38 @@ namespace CppSharp.Generators.CSharp @@ -1901,40 +1901,38 @@ namespace CppSharp.Generators.CSharp
var hasBaseClass = @class.HasBaseClass && @class.BaseClass.IsRefType;
if (hasBaseClass)
WriteLineIndent(": base(({0}.Internal*) native{1})",
QualifiedIdentifierIfNeeded(@class.BaseClass), @class.IsAbstractImpl ? ", true" : string.Empty);
WriteLineIndent(": base(({0}.Internal*) null)", QualifiedIdentifierIfNeeded(@class.BaseClass));
WriteStartBraceIndent();
if (@class.IsRefType)
{
if (shouldGenerateClassNativeField)
if (!@class.IsAbstractImpl)
{
WriteLine("if (native == null)");
WriteLineIndent("return;");
WriteLine("{0} = new global::System.IntPtr(native);", Helpers.InstanceIdentifier);
var dtor = @class.Destructors.FirstOrDefault();
if (dtor != null && dtor.IsVirtual)
{
WriteLine("if (skipVTables)");
PushIndent();
SaveOriginalVTablePointers(@class.Layout.VFTables);
PopIndent();
WriteLine("else");
PushIndent();
GenerateVTableClassSetupCall(@class);
PopIndent();
}
else
{
if (@class.IsDynamic && GetUniqueVTableMethodEntries(@class).Count != 0)
{
WriteLine("if (native != null)");
PushIndent();
SaveOriginalVTablePointers(@class.Layout.VFTables);
PopIndent();
}
}
}
WriteLine("{0} = new global::System.IntPtr(native);", Helpers.InstanceIdentifier);
var dtor = @class.Destructors.FirstOrDefault();
var hasVTables = @class.IsDynamic && GetUniqueVTableMethodEntries(@class).Count > 0;
var setupVTables = !@class.IsAbstractImpl && hasVTables && dtor != null && dtor.IsVirtual;
if (setupVTables)
{
WriteLine("if (skipVTables)");
PushIndent();
}
if (@class.IsAbstractImpl || hasVTables)
SaveOriginalVTablePointers(@class.Layout.VFTables);
if (setupVTables)
{
PopIndent();
WriteLine("else");
PushIndent();
GenerateVTableClassSetupCall(@class);
PopIndent();
}
}
else

Loading…
Cancel
Save