Browse Source

Fix value type out parameters

pull/1774/head
Salvage 2 years ago committed by João Matos
parent
commit
ebe6b8a415
  1. 11
      src/Generator/Generators/CSharp/CSharpMarshal.cs
  2. 2
      src/Generator/Generators/CSharp/CSharpSources.cs
  3. 7
      tests/dotnet/CSharp/CSharp.Tests.cs
  4. 5
      tests/dotnet/CSharp/CSharp.cpp
  5. 7
      tests/dotnet/CSharp/CSharp.h

11
src/Generator/Generators/CSharp/CSharpMarshal.cs

@ -634,17 +634,20 @@ namespace CppSharp.Generators.CSharp
{ {
if (Context.Parameter.Usage == ParameterUsage.Out) if (Context.Parameter.Usage == ParameterUsage.Out)
{ {
var qualifiedIdentifier = (@class.OriginalClass ?? @class).Visit(typePrinter); Context.Before.WriteLine("fixed ({0}.{1}* {2} = &{3}.{4})",
Context.Before.WriteLine("var {0} = new {1}.{2}();", Context.Parameter.QualifiedType, Helpers.InternalStruct,
arg, qualifiedIdentifier, Helpers.InternalStruct); arg, Context.Parameter.Name, Helpers.InstanceIdentifier);
Context.Before.WriteOpenBraceAndIndent();
Context.Return.Write($"new {typePrinter.IntPtrType}({arg})");
Context.Cleanup.UnindentAndWriteCloseBrace();
} }
else else
{ {
Context.Before.WriteLine("var {0} = {1}.{2};", Context.Before.WriteLine("var {0} = {1}.{2};",
arg, Context.Parameter.Name, Helpers.InstanceIdentifier); arg, Context.Parameter.Name, Helpers.InstanceIdentifier);
Context.Return.Write($"new {typePrinter.IntPtrType}(&{arg})");
} }
Context.Return.Write($"new {typePrinter.IntPtrType}(&{arg})");
return true; return true;
} }

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

@ -413,7 +413,7 @@ namespace CppSharp.Generators.CSharp
if (@class.IsValueType) if (@class.IsValueType)
{ {
WriteLine($"private {@class.Name}.{Helpers.InternalStruct} {Helpers.InstanceField};"); WriteLine($"private {@class.Name}.{Helpers.InternalStruct} {Helpers.InstanceField};");
WriteLine($"internal {@class.Name}.{Helpers.InternalStruct} {Helpers.InstanceIdentifier} => {Helpers.InstanceField};"); WriteLine($"internal ref {@class.Name}.{Helpers.InternalStruct} {Helpers.InstanceIdentifier} => ref {Helpers.InstanceField};");
} }
else else
{ {

7
tests/dotnet/CSharp/CSharp.Tests.cs

@ -1995,4 +1995,11 @@ public unsafe class CSharpTests
Assert.IsTrue(CSharp.CSharp.PointerToClass.IsDefaultInstance); Assert.IsTrue(CSharp.CSharp.PointerToClass.IsDefaultInstance);
Assert.IsTrue(CSharp.CSharp.PointerToClass.IsValid); Assert.IsTrue(CSharp.CSharp.PointerToClass.IsValid);
} }
[Test]
public void TestValueTypeOutParameter()
{
CSharp.CSharp.ValueTypeOutParameter(out var unionTest);
Assert.AreEqual(2, unionTest.A);
}
} }

5
tests/dotnet/CSharp/CSharp.cpp

@ -1791,3 +1791,8 @@ bool PointerTester::IsValid()
} }
PointerTester* PointerToClass = &internalPointerTesterInstance; PointerTester* PointerToClass = &internalPointerTesterInstance;
void ValueTypeOutParameter(UnionTester* tester)
{
tester->a = 2;
}

7
tests/dotnet/CSharp/CSharp.h

@ -1603,3 +1603,10 @@ public:
}; };
DLL_API extern PointerTester* PointerToClass; DLL_API extern PointerTester* PointerToClass;
union DLL_API UnionTester {
float a;
int b;
};
void DLL_API ValueTypeOutParameter(CS_OUT UnionTester* tester);

Loading…
Cancel
Save