Skip to content

Commit efbe7cd

Browse files
committed
Fixed the generated C# for a fixed array of pointers.
Signed-off-by: Dimitar Dobrev <[email protected]>
1 parent 8958217 commit efbe7cd

File tree

4 files changed

+55
-11
lines changed

4 files changed

+55
-11
lines changed

src/Generator/Generators/CSharp/CSharpMarshal.cs

Lines changed: 25 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -98,12 +98,20 @@ public override bool VisitArrayType(ArrayType array, TypeQualifiers quals)
9898
else
9999
{
100100
var arrayType = array.Type.Desugar();
101+
var finalArrayType = arrayType.GetPointee() ?? arrayType;
101102
Class @class;
102-
if (arrayType.TryGetClass(out @class) && @class.IsRefType)
103-
supportBefore.WriteLineIndent(
104-
"{0}[i] = {1}.{2}(*(({1}.{3}*)&({4}[i * sizeof({1}.{3})])));",
105-
value, array.Type, Helpers.CreateInstanceIdentifier,
106-
Helpers.InternalStruct, Context.ReturnVarName);
103+
if ((finalArrayType.TryGetClass(out @class)) && @class.IsRefType)
104+
{
105+
if (arrayType == finalArrayType)
106+
supportBefore.WriteLineIndent(
107+
"{0}[i] = {1}.{2}(*(({1}.{3}*)&({4}[i * sizeof({1}.{3})])));",
108+
value, array.Type, Helpers.CreateInstanceIdentifier,
109+
Helpers.InternalStruct, Context.ReturnVarName);
110+
else
111+
supportBefore.WriteLineIndent(
112+
$@"{value}[i] = {finalArrayType}.{Helpers.CreateInstanceIdentifier}(({
113+
CSharpTypePrinter.IntPtrType}) {Context.ReturnVarName}[i]);");
114+
}
107115
else
108116
{
109117
if (arrayType.IsPrimitiveType(PrimitiveType.Char) &&
@@ -483,7 +491,6 @@ public override bool VisitArrayType(ArrayType array, TypeQualifiers quals)
483491
if (!VisitType(array, quals))
484492
return false;
485493

486-
var arrayType = array.Type.Desugar();
487494
switch (array.SizeType)
488495
{
489496
case ArrayType.ArraySize.Constant:
@@ -497,18 +504,25 @@ public override bool VisitArrayType(ArrayType array, TypeQualifiers quals)
497504
supportBefore.WriteLine("if ({0} != null)", Context.ArgName);
498505
supportBefore.WriteStartBraceIndent();
499506
Class @class;
500-
if (arrayType.TryGetClass(out @class) && @class.IsRefType)
507+
var arrayType = array.Type.Desugar();
508+
var finalArrayType = arrayType.GetPointee() ?? arrayType;
509+
if (finalArrayType.TryGetClass(out @class) && @class.IsRefType)
501510
{
502511
supportBefore.WriteLine("if (value.Length != {0})", array.Size);
503512
ThrowArgumentOutOfRangeException();
504513
}
505514
supportBefore.WriteLine("for (int i = 0; i < {0}; i++)", array.Size);
506515
if (@class != null && @class.IsRefType)
507516
{
508-
supportBefore.WriteLineIndent(
509-
"*({1}.{2}*) &{0}[i * sizeof({1}.{2})] = *({1}.{2}*){3}[i].{4};",
510-
Context.ReturnVarName, arrayType, Helpers.InternalStruct,
511-
Context.ArgName, Helpers.InstanceIdentifier);
517+
if (finalArrayType == arrayType)
518+
supportBefore.WriteLineIndent(
519+
"*({1}.{2}*) &{0}[i * sizeof({1}.{2})] = *({1}.{2}*){3}[i].{4};",
520+
Context.ReturnVarName, arrayType, Helpers.InternalStruct,
521+
Context.ArgName, Helpers.InstanceIdentifier);
522+
else
523+
supportBefore.WriteLineIndent($@"{Context.ReturnVarName}[i] = ({
524+
(Context.Context.TargetInfo.PointerWidth == 64 ? "long" : "int")}) {
525+
Context.ArgName}[i].{Helpers.InstanceIdentifier};");
512526
}
513527
else
514528
{

tests/CSharp/CSharp.Tests.cs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1108,6 +1108,21 @@ public void TestStringArrayParams()
11081108
}
11091109
}
11101110

1111+
[Test]
1112+
public void TestHasFixedArrayOfPointers()
1113+
{
1114+
using (var hasFixedArrayOfPointers = new HasFixedArrayOfPointers())
1115+
{
1116+
var foos = new Foo[] { new Foo() { A = 5 }, new Foo { A = 15 }, new Foo { A = 20 } };
1117+
hasFixedArrayOfPointers.FixedArrayOfPointers = foos;
1118+
for (int i = 0; i < hasFixedArrayOfPointers.FixedArrayOfPointers.Length; i++)
1119+
Assert.That(hasFixedArrayOfPointers.FixedArrayOfPointers[i].A,
1120+
Is.EqualTo(foos[i].A));
1121+
foreach (var foo in foos)
1122+
foo.Dispose();
1123+
}
1124+
}
1125+
11111126
private class OverrideVirtualTemplate : VirtualTemplate<int>
11121127
{
11131128
public override int Function

tests/CSharp/CSharp.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1450,3 +1450,11 @@ int TestArrays::virtualTakeArrays(Foo *fixedArrayOfPointersToObjects[], int fixe
14501450
{
14511451
return takeArrays(fixedArrayOfPointersToObjects, fixedArrayOfPrimitives, fixedArrayOfPointersToPrimitives);
14521452
}
1453+
1454+
HasFixedArrayOfPointers::HasFixedArrayOfPointers()
1455+
{
1456+
}
1457+
1458+
HasFixedArrayOfPointers::~HasFixedArrayOfPointers()
1459+
{
1460+
}

tests/CSharp/CSharp.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1257,3 +1257,10 @@ class TestForwardedClassInAnotherUnit
12571257
{
12581258
};
12591259

1260+
class DLL_API HasFixedArrayOfPointers
1261+
{
1262+
public:
1263+
HasFixedArrayOfPointers();
1264+
~HasFixedArrayOfPointers();
1265+
Foo* fixedArrayOfPointers[3];
1266+
};

0 commit comments

Comments
 (0)