in SharpGen/Generator/Marshallers/ValueTypeArrayMarshaller.Copy.cs [27:71]
private StatementSyntax GenerateCopyMemory(CsMarshalBase marshallable, ArrayCopyDirection direction)
{
static VariableDeclaratorSyntax FixedDeclaration(SyntaxToken name, ExpressionSyntax source) =>
VariableDeclarator(
name,
default,
EqualsValueClause(PrefixUnaryExpression(SyntaxKind.AddressOfExpression, source))
);
// managed is __to when NativeToManaged, __from when ManagedToNative
// native is __from when NativeToManaged, __to when ManagedToNative
var (managed, native) = CopyDirectionToIdentifiers(
direction, Identifier(ToIdentifier), Identifier(FromIdentifier)
);
return FixedStatement(
VariableDeclaration(
VoidPtrType,
SeparatedList(
new[]
{
FixedDeclaration(
managed,
ElementAccessExpression(
IdentifierName(marshallable.Name),
BracketedArgumentList(SingletonSeparatedList(Argument(ZeroLiteral)))
)
),
FixedDeclaration(native, GetMarshalStorageLocation(marshallable))
}
)
),
GenerateCopyMemoryInvocation(
BinaryExpression(
SyntaxKind.MultiplyExpression,
LiteralExpression(
SyntaxKind.NumericLiteralExpression,
Literal(marshallable.ArrayDimensionValueUnsigned)
),
SizeOf(marshallable.MarshalType)
),
castTo: false, castFrom: false
)
);
}