Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -512,10 +512,8 @@ void GenerateStatementsForInvoke(List<StatementSyntax> statementsToUpdate, Invoc
ParameterList(
SeparatedList(
_paramMarshallers.Select(marshaler => marshaler.Generator.AsParameter(marshaler.TypeInfo)))),
_retMarshaller.Generator.AsNativeType(_retMarshaller.TypeInfo),
_retMarshaller.Generator is IAttributedReturnTypeMarshallingGenerator attributedReturn
? attributedReturn.GenerateAttributesForReturnType(_retMarshaller.TypeInfo)
: null
_retMarshaller.Generator.AsReturnType(_retMarshaller.TypeInfo),
_retMarshaller.Generator.GenerateAttributesForReturnType(_retMarshaller.TypeInfo)
);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,24 +27,23 @@ public bool IsSupported(TargetFramework target, Version version)
return target is TargetFramework.Net && version.Major >= 7;
}

public ArgumentSyntax AsArgument(TypePositionInfo info, StubCodeContext context)
public ValueBoundaryBehavior GetValueBoundaryBehavior(TypePositionInfo info, StubCodeContext context)
{
if (IsPinningPathSupported(info, context))
{
string identifier = context.GetIdentifiers(info).native;
return Argument(CastExpression(AsNativeType(info), IdentifierName(identifier)));
return ValueBoundaryBehavior.NativeIdentifier;
}
return _manualMarshallingGenerator.AsArgument(info, context);
return _manualMarshallingGenerator.GetValueBoundaryBehavior(info, context);
}

public TypeSyntax AsNativeType(TypePositionInfo info)
{
return _manualMarshallingGenerator.AsNativeType(info);
}

public ParameterSyntax AsParameter(TypePositionInfo info)
public SignatureBehavior GetNativeSignatureBehavior(TypePositionInfo info)
{
return _manualMarshallingGenerator.AsParameter(info);
return _manualMarshallingGenerator.GetNativeSignatureBehavior(info);
}

public IEnumerable<StatementSyntax> Generate(TypePositionInfo info, StubCodeContext context)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,29 +20,22 @@ public TypeSyntax AsNativeType(TypePositionInfo info)
return info.ManagedType.Syntax;
}

public ParameterSyntax AsParameter(TypePositionInfo info)
public SignatureBehavior GetNativeSignatureBehavior(TypePositionInfo info)
{
TypeSyntax type = info.IsByRef
? PointerType(AsNativeType(info))
: AsNativeType(info);
return Parameter(Identifier(info.InstanceIdentifier))
.WithType(type);
return info.IsByRef ? SignatureBehavior.PointerToNativeType : SignatureBehavior.NativeType;
}

public ArgumentSyntax AsArgument(TypePositionInfo info, StubCodeContext context)
public ValueBoundaryBehavior GetValueBoundaryBehavior(TypePositionInfo info, StubCodeContext context)
{
if (!info.IsByRef)
{
return Argument(IdentifierName(info.InstanceIdentifier));
return ValueBoundaryBehavior.ManagedIdentifier;
}
else if (context.SingleFrameSpansNativeContext && !info.IsManagedReturnPosition)
{
return Argument(IdentifierName(context.GetIdentifiers(info).native));
return ValueBoundaryBehavior.NativeIdentifier;
}
return Argument(
PrefixUnaryExpression(
SyntaxKind.AddressOfExpression,
IdentifierName(context.GetIdentifiers(info).native)));
return ValueBoundaryBehavior.AddressOfNativeIdentifier;
}

public IEnumerable<StatementSyntax> Generate(TypePositionInfo info, StubCodeContext context)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,27 +35,19 @@ public TypeSyntax AsNativeType(TypePositionInfo info)
return _nativeType;
}

public ParameterSyntax AsParameter(TypePositionInfo info)
public SignatureBehavior GetNativeSignatureBehavior(TypePositionInfo info)
{
TypeSyntax type = info.IsByRef
? PointerType(AsNativeType(info))
: AsNativeType(info);
return Parameter(Identifier(info.InstanceIdentifier))
.WithType(type);
return info.IsByRef ? SignatureBehavior.PointerToNativeType : SignatureBehavior.NativeType;
}

public ArgumentSyntax AsArgument(TypePositionInfo info, StubCodeContext context)
public ValueBoundaryBehavior GetValueBoundaryBehavior(TypePositionInfo info, StubCodeContext context)
{
string identifier = context.GetIdentifiers(info).native;
if (info.IsByRef)
{
return Argument(
PrefixUnaryExpression(
SyntaxKind.AddressOfExpression,
IdentifierName(identifier)));
return ValueBoundaryBehavior.AddressOfNativeIdentifier;
}

return Argument(IdentifierName(identifier));
return ValueBoundaryBehavior.NativeIdentifier;
}

public IEnumerable<StatementSyntax> Generate(TypePositionInfo info, StubCodeContext context)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,31 +22,18 @@ public Utf16CharMarshaller()

public bool IsSupported(TargetFramework target, Version version) => true;

public ArgumentSyntax AsArgument(TypePositionInfo info, StubCodeContext context)
public ValueBoundaryBehavior GetValueBoundaryBehavior(TypePositionInfo info, StubCodeContext context)
{
(string managedIdentifier, string nativeIdentifier) = context.GetIdentifiers(info);
if (!info.IsByRef)
{
// (ushort)<managedIdentifier>
return Argument(
CastExpression(
AsNativeType(info),
IdentifierName(managedIdentifier)));
return ValueBoundaryBehavior.ManagedIdentifier;
}
else if (IsPinningPathSupported(info, context))
{
// (ushort*)<pinned>
return Argument(
CastExpression(
PointerType(AsNativeType(info)),
IdentifierName(PinnedIdentifier(info.InstanceIdentifier))));
return ValueBoundaryBehavior.NativeIdentifier;
}

// &<nativeIdentifier>
return Argument(
PrefixUnaryExpression(
SyntaxKind.AddressOfExpression,
IdentifierName(nativeIdentifier)));
return ValueBoundaryBehavior.AddressOfNativeIdentifier;
}

public TypeSyntax AsNativeType(TypePositionInfo info)
Expand All @@ -55,13 +42,9 @@ public TypeSyntax AsNativeType(TypePositionInfo info)
return s_nativeType;
}

public ParameterSyntax AsParameter(TypePositionInfo info)
public SignatureBehavior GetNativeSignatureBehavior(TypePositionInfo info)
{
TypeSyntax type = info.IsByRef
? PointerType(AsNativeType(info))
: AsNativeType(info);
return Parameter(Identifier(info.InstanceIdentifier))
.WithType(type);
return info.IsByRef ? SignatureBehavior.PointerToNativeType : SignatureBehavior.NativeType;
}

public IEnumerable<StatementSyntax> Generate(TypePositionInfo info, StubCodeContext context)
Expand All @@ -85,7 +68,15 @@ public IEnumerable<StatementSyntax> Generate(TypePositionInfo info, StubCodeCont
))
)
),
EmptyStatement()
// ushort* <native> = (ushort*)<pinned>;
LocalDeclarationStatement(
VariableDeclaration(PointerType(AsNativeType(info)),
SingletonSeparatedList(
VariableDeclarator(nativeIdentifier)
.WithInitializer(EqualsValueClause(
CastExpression(
PointerType(AsNativeType(info)),
IdentifierName(PinnedIdentifier(info.InstanceIdentifier))))))))
);
}
yield break;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -238,10 +238,10 @@ public virtual bool IsSupported(TargetFramework target, Version version)
public abstract TypeSyntax AsNativeType(TypePositionInfo info);

/// <inheritdoc/>
public abstract ParameterSyntax AsParameter(TypePositionInfo info);
public abstract SignatureBehavior GetNativeSignatureBehavior(TypePositionInfo info);

/// <inheritdoc/>
public abstract ArgumentSyntax AsArgument(TypePositionInfo info, StubCodeContext context);
public abstract ValueBoundaryBehavior GetValueBoundaryBehavior(TypePositionInfo info, StubCodeContext context);

/// <inheritdoc/>
public abstract IEnumerable<StatementSyntax> Generate(TypePositionInfo info, StubCodeContext context);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,23 +28,19 @@ public bool IsSupported(TargetFramework target, Version version)
return target is TargetFramework.Net && version.Major >= 6;
}

public ArgumentSyntax AsArgument(TypePositionInfo info, StubCodeContext context)
public ValueBoundaryBehavior GetValueBoundaryBehavior(TypePositionInfo info, StubCodeContext context)
{
return _nativeTypeMarshaller.AsArgument(info, context);
return info.IsByRef ? ValueBoundaryBehavior.AddressOfNativeIdentifier : ValueBoundaryBehavior.NativeIdentifier;
}

public TypeSyntax AsNativeType(TypePositionInfo info)
{
return _nativeTypeMarshaller.AsNativeType(info);
}

public ParameterSyntax AsParameter(TypePositionInfo info)
public SignatureBehavior GetNativeSignatureBehavior(TypePositionInfo info)
{
TypeSyntax type = info.IsByRef
? PointerType(AsNativeType(info))
: AsNativeType(info);
return Parameter(Identifier(info.InstanceIdentifier))
.WithType(type);
return info.IsByRef ? SignatureBehavior.PointerToNativeType : SignatureBehavior.NativeType;
}

public IEnumerable<StatementSyntax> Generate(TypePositionInfo info, StubCodeContext context)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,27 +19,14 @@ public TypeSyntax AsNativeType(TypePositionInfo info)
return MarshallerHelpers.SystemIntPtrType;
}

public ParameterSyntax AsParameter(TypePositionInfo info)
public SignatureBehavior GetNativeSignatureBehavior(TypePositionInfo info)
{
TypeSyntax type = info.IsByRef
? PointerType(AsNativeType(info))
: AsNativeType(info);
return Parameter(Identifier(info.InstanceIdentifier))
.WithType(type);
return info.IsByRef ? SignatureBehavior.PointerToNativeType : SignatureBehavior.NativeType;
}

public ArgumentSyntax AsArgument(TypePositionInfo info, StubCodeContext context)
public ValueBoundaryBehavior GetValueBoundaryBehavior(TypePositionInfo info, StubCodeContext context)
{
string identifier = context.GetIdentifiers(info).native;
if (info.IsByRef)
{
return Argument(
PrefixUnaryExpression(
SyntaxKind.AddressOfExpression,
IdentifierName(identifier)));
}

return Argument(IdentifierName(identifier));
return info.IsByRef ? ValueBoundaryBehavior.AddressOfNativeIdentifier : ValueBoundaryBehavior.NativeIdentifier;
}

public IEnumerable<StatementSyntax> Generate(TypePositionInfo info, StubCodeContext context)
Expand Down
Loading