Skip to content

Commit

Permalink
[DllImportGenerator] Fix stub generation for char array marshalling (#…
Browse files Browse the repository at this point in the history
  • Loading branch information
elinor-fung committed Nov 4, 2021
1 parent 1e48eca commit 22f0683
Show file tree
Hide file tree
Showing 3 changed files with 51 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,7 @@ public IEnumerable<StatementSyntax> Generate(TypePositionInfo info, StubCodeCont
case StubCodeContext.Stage.Setup:
break;
case StubCodeContext.Stage.Marshal:
if (info.IsByRef && info.RefKind != RefKind.Out)
if ((info.IsByRef && info.RefKind != RefKind.Out) || !context.SingleFrameSpansNativeContext)
{
yield return ExpressionStatement(
AssignmentExpression(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,12 @@ public partial class Arrays
[GeneratedDllImport(NativeExportsNE_Binary, EntryPoint = "create_range_array_out")]
public static partial void CreateRange_Out(int start, int end, out int numValues, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 2)] out int[] res);

[GeneratedDllImport(NativeExportsNE_Binary, EntryPoint = "sum_char_array", CharSet = CharSet.Unicode)]
public static partial int SumChars(char[] chars, int numElements);

[GeneratedDllImport(NativeExportsNE_Binary, EntryPoint = "reverse_char_array", CharSet = CharSet.Unicode)]
public static partial void ReverseChars([MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1)] ref char[] chars, int numElements);

[GeneratedDllImport(NativeExportsNE_Binary, EntryPoint = "sum_string_lengths")]
public static partial int SumStringLengths([MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.LPWStr)] string[] strArray);

Expand Down Expand Up @@ -118,6 +124,22 @@ public void IntArrayRefParameter()
Assert.Equal((IEnumerable<int>)array, newArray);
}

[Fact]
public void CharArrayMarshalledToNativeAsExpected()
{
char[] array = CharacterTests.CharacterMappings().Select(o => (char)o[0]).ToArray();
Assert.Equal(array.Sum(c => c), NativeExportsNE.Arrays.SumChars(array, array.Length));
}

[Fact]
public void CharArrayRefParameter()
{
char[] array = CharacterTests.CharacterMappings().Select(o => (char)o[0]).ToArray();
var newArray = array;
NativeExportsNE.Arrays.ReverseChars(ref newArray, array.Length);
Assert.Equal(array.Reverse(), newArray);
}

[Fact]
public void ArraysReturnedFromNative()
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,34 @@ public static void DoubleValues([DNNE.C99Type("struct int_struct_wrapper*")] Int
}
}

[UnmanagedCallersOnly(EntryPoint = "sum_char_array")]
public static int SumChars(ushort* values, int numValues)
{
if (values == null)
{
return -1;
}

int sum = 0;
for (int i = 0; i < numValues; i++)
{
sum += values[i];
}
return sum;
}

[UnmanagedCallersOnly(EntryPoint = "reverse_char_array")]
public static void ReverseChars(ushort** values, int numValues)
{
if (*values == null)
{
return;
}

var span = new Span<ushort>(*values, numValues);
span.Reverse();
}

[UnmanagedCallersOnly(EntryPoint = "sum_string_lengths")]
public static int SumStringLengths(ushort** strArray)
{
Expand Down

0 comments on commit 22f0683

Please sign in to comment.