From 23fc25facacf36d14cc3b8cb5fab91a7feeb5a01 Mon Sep 17 00:00:00 2001 From: triton Date: Tue, 5 Nov 2013 03:49:19 +0000 Subject: [PATCH] Fixed generation of vtable components. Only generate delegates for each unique vtable component entry and skip vtable hook registration for duplicated entries. --- .../Generators/CSharp/CSharpTextTemplate.cs | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/Generator/Generators/CSharp/CSharpTextTemplate.cs b/src/Generator/Generators/CSharp/CSharpTextTemplate.cs index b79a6935..868e53e6 100644 --- a/src/Generator/Generators/CSharp/CSharpTextTemplate.cs +++ b/src/Generator/Generators/CSharp/CSharpTextTemplate.cs @@ -5,6 +5,7 @@ using System.IO; using System.Linq; using System.Text; using CppSharp.AST; +using CppSharp.Utils; using Type = CppSharp.AST.Type; namespace CppSharp.Generators.CSharp @@ -1124,6 +1125,15 @@ namespace CppSharp.Generators.CSharp (p.GetMethod == e.Method || p.SetMethod == e.Method))).ToList(); } + public List GetUniqueVTableMethodEntries(Class @class) + { + var uniqueEntries = new OrderedSet(); + foreach (var entry in GetVTableMethodEntries(@class)) + uniqueEntries.Add(entry); + + return uniqueEntries.ToList(); + } + public void GenerateVTable(Class @class) { var entries = GetVTableMethodEntries(@class); @@ -1135,7 +1145,7 @@ namespace CppSharp.Generators.CSharp NewLine(); // Generate a delegate type for each method. - foreach (var entry in entries) + foreach (var entry in GetUniqueVTableMethodEntries(@class)) { var method = entry.Method; GenerateVTableMethodDelegates(@class, method); @@ -1197,13 +1207,16 @@ namespace CppSharp.Generators.CSharp WriteLine("_Thunks = new IntPtr[{0}];", entries.Count); + var uniqueEntries = new HashSet(); + index = 0; foreach (var entry in entries) { var method = entry.Method; var delegateName = GetVTableMethodDelegateName(method); var delegateInstance = delegateName + "Instance"; - WriteLine("{0} += {1}Hook;", delegateInstance, delegateName); + if (uniqueEntries.Add(entry)) + WriteLine("{0} += {1}Hook;", delegateInstance, delegateName); WriteLine("_Thunks[{0}] = Marshal.GetFunctionPointerForDelegate({1});", index++, delegateInstance); }