From a1fa5bd93f45bcac037dfc8ad3a27c17f0a46bd5 Mon Sep 17 00:00:00 2001 From: Dimitar Dobrev Date: Mon, 6 Mar 2017 00:51:22 +0200 Subject: [PATCH] Changed the generation of patched v-tables to also work for class templates. Signed-off-by: Dimitar Dobrev --- .../Generators/CSharp/CSharpSources.cs | 26 +++++++++---------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/src/Generator/Generators/CSharp/CSharpSources.cs b/src/Generator/Generators/CSharp/CSharpSources.cs index 5b227c9c..29dc777d 100644 --- a/src/Generator/Generators/CSharp/CSharpSources.cs +++ b/src/Generator/Generators/CSharp/CSharpSources.cs @@ -247,20 +247,16 @@ namespace CppSharp.Generators.CSharp private static List GetSpecializationsToGenerate(Class classTemplate) { - List specializations; if (classTemplate.Fields.Any( f => f.Type.Desugar() is TemplateParameterType)) - specializations = classTemplate.Specializations; - else - { - specializations = new List(); - var specialization = classTemplate.Specializations.FirstOrDefault(s => !s.Ignore); - if (specialization == null) - specializations.Add(classTemplate.Specializations[0]); - else - specializations.Add(specialization); - } + return classTemplate.Specializations; + var specializations = new List(); + var specialization = classTemplate.Specializations.FirstOrDefault(s => !s.Ignore); + if (specialization == null) + specializations.Add(classTemplate.Specializations[0]); + else + specializations.Add(specialization); return specializations; } @@ -1282,6 +1278,9 @@ namespace CppSharp.Generators.CSharp public void GenerateVTable(Class @class) { + var containingClass = @class; + @class = @class.IsDependent ? @class.Specializations[0] : @class; + var wrappedEntries = GetUniqueVTableMethodEntries(@class); if (wrappedEntries.Count == 0) return; @@ -1292,9 +1291,8 @@ namespace CppSharp.Generators.CSharp // Generate a delegate type for each method. foreach (var method in wrappedEntries.Select(e => e.Method)) - { - GenerateVTableMethodDelegates(@class, method); - } + GenerateVTableMethodDelegates(containingClass, containingClass.IsDependent ? + containingClass.Methods[@class.Methods.IndexOf(method)] : method); WriteLine("private static void*[] __ManagedVTables;"); if (wrappedEntries.Any(e => e.Method.IsDestructor))