Browse Source

Simplify the mapping of virtual tables in C#

Signed-off-by: Dimitar Dobrev <dpldobrev@protonmail.com>
pull/1371/head
Dimitar Dobrev 5 years ago
parent
commit
081ac688f4
  1. 4
      src/AST/ClassLayout.cs
  2. 25
      src/Generator/Generators/CSharp/CSharpSources.cs

4
src/AST/ClassLayout.cs

@ -165,7 +165,9 @@ namespace CppSharp.AST @@ -165,7 +165,9 @@ namespace CppSharp.AST
{
if (vTablePointers == null)
{
vTablePointers = new List<LayoutField>(Fields.Where(f => f.IsVTablePtr));
vTablePointers = ABI == CppAbi.Microsoft ?
new List<LayoutField>(Fields.Where(f => f.IsVTablePtr)) :
new List<LayoutField> { Fields.First(f => f.IsVTablePtr) };
}
return vTablePointers;
}

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

@ -1609,10 +1609,7 @@ namespace CppSharp.Generators.CSharp @@ -1609,10 +1609,7 @@ namespace CppSharp.Generators.CSharp
private void AssignNewVTableEntries(Class @class, string table)
{
int size = Context.ParserOptions.IsMicrosoftAbi ?
@class.Layout.VTablePointers.Count : 1;
for (int i = 0; i < size; i++)
for (int i = 0; i < @class.Layout.VTablePointers.Count; i++)
{
var offset = @class.Layout.VTablePointers[i].Offset;
WriteLine($"*(void**) ({Helpers.InstanceIdentifier} + {offset}) = {table}[{i}];");
@ -1624,16 +1621,8 @@ namespace CppSharp.Generators.CSharp @@ -1624,16 +1621,8 @@ namespace CppSharp.Generators.CSharp
if (@class.IsDependent)
@class = @class.Specializations[0];
Write("new void*[] { ");
if (Context.ParserOptions.IsMicrosoftAbi)
Write(string.Join(", ", @class.Layout.VTablePointers.Select(
v => $"*(void**) ({Helpers.InstanceIdentifier} + {v.Offset})")));
else
Write($@"*(void**) ({Helpers.InstanceIdentifier} + {
@class.Layout.VTablePointers[0].Offset})");
WriteLine(" };");
Write($@"new void*[] {{ {string.Join(", ", @class.Layout.VTablePointers.Select(
v => $"*(void**) ({Helpers.InstanceIdentifier} + {v.Offset})"))} }};");
}
private void AllocateNewVTablesMS(Class @class, IList<VTableComponent> wrappedEntries,
@ -2098,13 +2087,9 @@ namespace CppSharp.Generators.CSharp @@ -2098,13 +2087,9 @@ namespace CppSharp.Generators.CSharp
if (@class.IsDynamic && GetUniqueVTableMethodEntries(@class).Count != 0)
{
ClassLayout layout = (@class.IsDependent ? @class.Specializations[0] : @class).Layout;
if (Context.ParserOptions.IsMicrosoftAbi)
for (var i = 0; i < layout.VTablePointers.Count; i++)
WriteLine($@"(({classInternal}*) {Helpers.InstanceIdentifier})->{
layout.VTablePointers[i].Name} = new global::System.IntPtr(__OriginalVTables[{i}]);");
else
for (var i = 0; i < layout.VTablePointers.Count; i++)
WriteLine($@"(({classInternal}*) {Helpers.InstanceIdentifier})->{
layout.VTablePointers[0].Name} = new global::System.IntPtr(__OriginalVTables[0]);");
layout.VTablePointers[i].Name} = new global::System.IntPtr(__OriginalVTables[{i}]);");
}
}

Loading…
Cancel
Save