Skip to content

Commit

Permalink
Handle case where void* is a field. (#1195)
Browse files Browse the repository at this point in the history
* Handle case where void* is a field.
  • Loading branch information
AaronRobinsonMSFT authored Jun 1, 2021
1 parent 1bc504d commit 41bf5d1
Show file tree
Hide file tree
Showing 4 changed files with 25 additions and 27 deletions.
33 changes: 20 additions & 13 deletions DllImportGenerator/DllImportGenerator.UnitTests/CodeSnippets.cs
Original file line number Diff line number Diff line change
Expand Up @@ -503,14 +503,24 @@ partial class Test
public static string DelegateMarshalAsParametersAndModifiers = MarshalAsParametersAndModifiers("MyDelegate", UnmanagedType.FunctionPtr) + @"
delegate int MyDelegate(int a);";

public static string BlittableStructParametersAndModifiers = BasicParametersAndModifiers("MyStruct") + @"
#pragma warning disable CS0169
[BlittableType]
struct MyStruct
{
private static string BlittableMyStruct(string modifier = "") => $@"#pragma warning disable CS0169
{modifier} unsafe struct MyStruct
{{
private int i;
private short s;
}";
private long l;
private double d;
private int* iptr;
private short* sptr;
private long* lptr;
private double* dptr;
private void* vptr;
}}";

public static string BlittableStructParametersAndModifiers = BasicParametersAndModifiers("MyStruct") + $@"
[BlittableType]
{BlittableMyStruct()}
";

public static string ArrayParametersAndModifiers(string elementType) => $@"
using System.Runtime.InteropServices;
Expand Down Expand Up @@ -1045,13 +1055,10 @@ struct Generic<T>
public static string MaybeBlittableGenericTypeParametersAndModifiers<T>() =>
MaybeBlittableGenericTypeParametersAndModifiers(typeof(T).ToString());

public static string ImplicitlyBlittableStructParametersAndModifiers(string visibility = "") => BasicParametersAndModifiers("ImplicitBlittable") + $@"
#pragma warning disable CS0649
#pragma warning disable CS0169
{visibility} struct ImplicitBlittable
{{
int i;
}}";
public static string ImplicitlyBlittableStructParametersAndModifiers(string visibility = "") => BasicParametersAndModifiers("MyStruct") + $@"
// Implicitly blittable
{BlittableMyStruct(visibility)}
";

public static string ImplicitlyBlittableGenericTypeParametersAndModifiers(string typeArgument, string visibility = "") => BasicParametersAndModifiers($"Generic<{typeArgument}>") + $@"
{visibility} struct Generic<T>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ private static bool RequiresMarshalling(IMethodSymbol method, DllImportData dllI
return true;

// Check if return value requires marshalling
if (!method.ReturnsVoid && RequiresMarshalling(method.ReturnType))
if (!method.ReturnsVoid && !method.ReturnType.IsConsideredBlittable())
return true;

// Check if parameters require marshalling
Expand All @@ -82,7 +82,7 @@ private static bool RequiresMarshalling(IMethodSymbol method, DllImportData dllI
if (paramType.RefKind != RefKind.None)
return true;

if (RequiresMarshalling(paramType.Type))
if (!paramType.Type.IsConsideredBlittable())
return true;
}

Expand Down Expand Up @@ -110,16 +110,5 @@ private static bool RequiresMarshalling(IMethodSymbol method, DllImportData dllI

return false;
}

private static bool RequiresMarshalling(ITypeSymbol typeSymbol)
{
if (typeSymbol.TypeKind == TypeKind.Enum)
return false;

if (typeSymbol.TypeKind == TypeKind.Pointer)
return false;

return !typeSymbol.IsConsideredBlittable();
}
}
}
1 change: 1 addition & 0 deletions DllImportGenerator/DllImportGenerator/TypePositionInfo.cs
Original file line number Diff line number Diff line change
Expand Up @@ -314,6 +314,7 @@ static NativeMarshallingAttributeInfo CreateNativeMarshallingInfo(ITypeSymbol ty

static bool TryCreateTypeBasedMarshallingInfo(ITypeSymbol type, DefaultMarshallingInfo defaultInfo, Compilation compilation, GeneratorDiagnostics diagnostics, INamedTypeSymbol scopeSymbol, out MarshallingInfo marshallingInfo)
{
// Check for an implicit SafeHandle conversion.
var conversion = compilation.ClassifyCommonConversion(type, compilation.GetTypeByMetadataName(TypeNames.System_Runtime_InteropServices_SafeHandle)!);
if (conversion.Exists
&& conversion.IsImplicit
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,8 @@ private static bool HasOnlyBlittableFields(this ITypeSymbol type, HashSet<ITypeS
private static bool IsSpecialTypeBlittable(SpecialType specialType)
=> specialType switch
{
SpecialType.System_SByte
SpecialType.System_Void
or SpecialType.System_SByte
or SpecialType.System_Byte
or SpecialType.System_Int16
or SpecialType.System_UInt16
Expand Down

0 comments on commit 41bf5d1

Please sign in to comment.