Skip to content

Commit 081ac68

Browse files
committed
Simplify the mapping of virtual tables in C#
Signed-off-by: Dimitar Dobrev <[email protected]>
1 parent 0f4ee4c commit 081ac68

File tree

2 files changed

+8
-21
lines changed

2 files changed

+8
-21
lines changed

src/AST/ClassLayout.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,9 @@ public IList<LayoutField> VTablePointers
165165
{
166166
if (vTablePointers == null)
167167
{
168-
vTablePointers = new List<LayoutField>(Fields.Where(f => f.IsVTablePtr));
168+
vTablePointers = ABI == CppAbi.Microsoft ?
169+
new List<LayoutField>(Fields.Where(f => f.IsVTablePtr)) :
170+
new List<LayoutField> { Fields.First(f => f.IsVTablePtr) };
169171
}
170172
return vTablePointers;
171173
}

src/Generator/Generators/CSharp/CSharpSources.cs

Lines changed: 5 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1609,10 +1609,7 @@ private void AllocateNewVTables(Class @class, IList<VTableComponent> wrappedEntr
16091609

16101610
private void AssignNewVTableEntries(Class @class, string table)
16111611
{
1612-
int size = Context.ParserOptions.IsMicrosoftAbi ?
1613-
@class.Layout.VTablePointers.Count : 1;
1614-
1615-
for (int i = 0; i < size; i++)
1612+
for (int i = 0; i < @class.Layout.VTablePointers.Count; i++)
16161613
{
16171614
var offset = @class.Layout.VTablePointers[i].Offset;
16181615
WriteLine($"*(void**) ({Helpers.InstanceIdentifier} + {offset}) = {table}[{i}];");
@@ -1624,16 +1621,8 @@ private void SaveOriginalVTablePointers(Class @class)
16241621
if (@class.IsDependent)
16251622
@class = @class.Specializations[0];
16261623

1627-
Write("new void*[] { ");
1628-
1629-
if (Context.ParserOptions.IsMicrosoftAbi)
1630-
Write(string.Join(", ", @class.Layout.VTablePointers.Select(
1631-
v => $"*(void**) ({Helpers.InstanceIdentifier} + {v.Offset})")));
1632-
else
1633-
Write($@"*(void**) ({Helpers.InstanceIdentifier} + {
1634-
@class.Layout.VTablePointers[0].Offset})");
1635-
1636-
WriteLine(" };");
1624+
Write($@"new void*[] {{ {string.Join(", ", @class.Layout.VTablePointers.Select(
1625+
v => $"*(void**) ({Helpers.InstanceIdentifier} + {v.Offset})"))} }};");
16371626
}
16381627

16391628
private void AllocateNewVTablesMS(Class @class, IList<VTableComponent> wrappedEntries,
@@ -2098,13 +2087,9 @@ private void GenerateDisposeMethods(Class @class)
20982087
if (@class.IsDynamic && GetUniqueVTableMethodEntries(@class).Count != 0)
20992088
{
21002089
ClassLayout layout = (@class.IsDependent ? @class.Specializations[0] : @class).Layout;
2101-
if (Context.ParserOptions.IsMicrosoftAbi)
2102-
for (var i = 0; i < layout.VTablePointers.Count; i++)
2103-
WriteLine($@"(({classInternal}*) {Helpers.InstanceIdentifier})->{
2104-
layout.VTablePointers[i].Name} = new global::System.IntPtr(__OriginalVTables[{i}]);");
2105-
else
2090+
for (var i = 0; i < layout.VTablePointers.Count; i++)
21062091
WriteLine($@"(({classInternal}*) {Helpers.InstanceIdentifier})->{
2107-
layout.VTablePointers[0].Name} = new global::System.IntPtr(__OriginalVTables[0]);");
2092+
layout.VTablePointers[i].Name} = new global::System.IntPtr(__OriginalVTables[{i}]);");
21082093
}
21092094
}
21102095

0 commit comments

Comments
 (0)