From 014e141bc46fa17ed86f734e3f2cdede33c41fd6 Mon Sep 17 00:00:00 2001 From: triton Date: Wed, 14 Aug 2013 16:00:05 +0100 Subject: [PATCH] Added missing vtable generation support code. --- src/Generator/AST/VTables.cs | 82 ++++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 src/Generator/AST/VTables.cs diff --git a/src/Generator/AST/VTables.cs b/src/Generator/AST/VTables.cs new file mode 100644 index 00000000..fa6cb5cf --- /dev/null +++ b/src/Generator/AST/VTables.cs @@ -0,0 +1,82 @@ +using System; +using System.Collections.Generic; + +namespace CppSharp.AST +{ + public static class VTables + { + public static List GatherVTableMethodEntries(Class @class) + { + switch (@class.Layout.ABI) + { + case CppAbi.Microsoft: + return GatherVTableMethodsMS(@class); + case CppAbi.Itanium: + return GatherVTableMethodsItanium(@class); + } + + throw new NotSupportedException(); + } + + public static List GatherVTableMethodEntries(VTableLayout layout) + { + var entries = new List(); + + foreach (var component in layout.Components) + { + if (component.Kind == VTableComponentKind.CompleteDtorPointer) + continue; + + if (component.Kind == VTableComponentKind.RTTI) + continue; + + if (component.Kind == VTableComponentKind.UnusedFunctionPointer) + continue; + + if (component.Method != null) + entries.Add(component); + } + + return entries; + } + + public static List GatherVTableMethodsMS(Class @class) + { + var entries = new List(); + + foreach (var vfptr in @class.Layout.VFTables) + entries.AddRange(GatherVTableMethodEntries(vfptr.Layout)); + + return entries; + } + + public static List GatherVTableMethodsItanium(Class @class) + { + return GatherVTableMethodEntries(@class.Layout.Layout); + } + + public static int GetVTableComponentIndex(VTableLayout layout, VTableComponent entry) + { + return layout.Components.IndexOf(entry); + } + + public static int GetVTableComponentIndex(Class @class, VTableComponent entry) + { + switch (@class.Layout.ABI) + { + case CppAbi.Microsoft: + foreach (var vfptr in @class.Layout.VFTables) + { + var index = GetVTableComponentIndex(vfptr.Layout, entry); + if (index >= 0) + return index; + } + break; + case CppAbi.Itanium: + return GetVTableComponentIndex(@class.Layout.Layout, entry); + } + + throw new NotSupportedException(); + } + } +}