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. 30
      src/Generator/Generators/CSharp/CSharpTextTemplate.cs

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

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

Loading…
Cancel
Save