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
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,40 +1901,38 @@ 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); }
var dtor = @class.Destructors.FirstOrDefault();
if (dtor != null && dtor.IsVirtual) WriteLine("{0} = new global::System.IntPtr(native);", Helpers.InstanceIdentifier);
{ var dtor = @class.Destructors.FirstOrDefault();
WriteLine("if (skipVTables)"); var hasVTables = @class.IsDynamic && GetUniqueVTableMethodEntries(@class).Count > 0;
PushIndent(); var setupVTables = !@class.IsAbstractImpl && hasVTables && dtor != null && dtor.IsVirtual;
SaveOriginalVTablePointers(@class.Layout.VFTables); if (setupVTables)
PopIndent(); {
WriteLine("else"); WriteLine("if (skipVTables)");
PushIndent(); PushIndent();
GenerateVTableClassSetupCall(@class); }
PopIndent();
} if (@class.IsAbstractImpl || hasVTables)
else SaveOriginalVTablePointers(@class.Layout.VFTables);
{
if (@class.IsDynamic && GetUniqueVTableMethodEntries(@class).Count != 0) if (setupVTables)
{ {
WriteLine("if (native != null)"); PopIndent();
PushIndent(); WriteLine("else");
SaveOriginalVTablePointers(@class.Layout.VFTables); PushIndent();
PopIndent(); GenerateVTableClassSetupCall(@class);
} PopIndent();
}
} }
} }
else else

Loading…
Cancel
Save