Browse Source

Changed the generation of patched v-tables to also work for class templates.

Signed-off-by: Dimitar Dobrev <dpldobrev@protonmail.com>
pull/787/head
Dimitar Dobrev 8 years ago
parent
commit
a1fa5bd93f
  1. 26
      src/Generator/Generators/CSharp/CSharpSources.cs

26
src/Generator/Generators/CSharp/CSharpSources.cs

@ -247,20 +247,16 @@ namespace CppSharp.Generators.CSharp
private static List<ClassTemplateSpecialization> GetSpecializationsToGenerate(Class classTemplate) private static List<ClassTemplateSpecialization> GetSpecializationsToGenerate(Class classTemplate)
{ {
List<ClassTemplateSpecialization> specializations;
if (classTemplate.Fields.Any( if (classTemplate.Fields.Any(
f => f.Type.Desugar() is TemplateParameterType)) f => f.Type.Desugar() is TemplateParameterType))
specializations = classTemplate.Specializations; return classTemplate.Specializations;
else
{
specializations = new List<ClassTemplateSpecialization>();
var specialization = classTemplate.Specializations.FirstOrDefault(s => !s.Ignore);
if (specialization == null)
specializations.Add(classTemplate.Specializations[0]);
else
specializations.Add(specialization);
}
var specializations = new List<ClassTemplateSpecialization>();
var specialization = classTemplate.Specializations.FirstOrDefault(s => !s.Ignore);
if (specialization == null)
specializations.Add(classTemplate.Specializations[0]);
else
specializations.Add(specialization);
return specializations; return specializations;
} }
@ -1282,6 +1278,9 @@ namespace CppSharp.Generators.CSharp
public void GenerateVTable(Class @class) public void GenerateVTable(Class @class)
{ {
var containingClass = @class;
@class = @class.IsDependent ? @class.Specializations[0] : @class;
var wrappedEntries = GetUniqueVTableMethodEntries(@class); var wrappedEntries = GetUniqueVTableMethodEntries(@class);
if (wrappedEntries.Count == 0) if (wrappedEntries.Count == 0)
return; return;
@ -1292,9 +1291,8 @@ namespace CppSharp.Generators.CSharp
// Generate a delegate type for each method. // Generate a delegate type for each method.
foreach (var method in wrappedEntries.Select(e => e.Method)) foreach (var method in wrappedEntries.Select(e => e.Method))
{ GenerateVTableMethodDelegates(containingClass, containingClass.IsDependent ?
GenerateVTableMethodDelegates(@class, method); containingClass.Methods[@class.Methods.IndexOf(method)] : method);
}
WriteLine("private static void*[] __ManagedVTables;"); WriteLine("private static void*[] __ManagedVTables;");
if (wrappedEntries.Any(e => e.Method.IsDestructor)) if (wrappedEntries.Any(e => e.Method.IsDestructor))

Loading…
Cancel
Save