public ArgumentSyntax GenerateManagedArgument()

in SharpGen/Generator/Marshallers/ArrayMarshallerBase.cs [11:82]


        public ArgumentSyntax GenerateManagedArgument(CsParameter csElement) =>
            Argument(IdentifierName(csElement.Name));

        public ParameterSyntax GenerateManagedParameter(CsParameter csElement) =>
            GenerateManagedArrayParameter(csElement);

        public abstract StatementSyntax GenerateNativeCleanup(CsMarshalBase csElement, bool singleStackFrame);

        public IEnumerable<StatementSyntax> GenerateManagedToNativeProlog(CsMarshalCallableBase csElement)
        {
            var identifier = GetMarshalStorageLocationIdentifier(csElement);
            var elementType = GetMarshalElementTypeSyntax(csElement);
            var spanTypeName = GlobalNamespace.GetGenericTypeNameSyntax(
                BuiltinType.Span,
                TypeArgumentList(SingletonSeparatedList(elementType))
            );

            ArrayTypeSyntax GetArrayType(ExpressionSyntax length) => ArrayType(
                elementType,
                SingletonList(ArrayRankSpecifier(SingletonSeparatedList(length)))
            );

            yield return LocalDeclarationStatement(
                VariableDeclaration(
                    spanTypeName,
                    SingletonSeparatedList(
                        VariableDeclarator(
                            identifier, default,
                            EqualsValueClause(StackAllocArrayCreationExpression(GetArrayType(ZeroLiteral)))
                        )
                    )
                )
            );

            var variable = IdentifierName(identifier);
            var length = GeneratorHelpers.LengthExpression(IdentifierName(csElement.Name));

            var arrayType = GetArrayType(LengthIdentifierName);

            yield return GenerateNullCheckIfNeeded(
                csElement,
                Block(
                    LocalDeclarationStatement(
                        VariableDeclaration(
                            TypeInt32,
                            SingletonSeparatedList(
                                VariableDeclarator(LengthIdentifier, default, EqualsValueClause(length))
                            )
                        )
                    ),
                    ExpressionStatement(
                        AssignmentExpression(
                            SyntaxKind.SimpleAssignmentExpression,
                            variable,
                            ConditionalExpression(
                                BinaryExpression(
                                    SyntaxKind.LessThanExpression,
                                    BinaryExpression(
                                        SyntaxKind.MultiplyExpression,
                                        GeneratorHelpers.CastExpression(TypeUInt32, LengthIdentifierName),
                                        SizeOf(elementType)
                                    ),
                                    LiteralExpression(SyntaxKind.NumericLiteralExpression, Literal(1024u))
                                ),
                                StackAllocArrayCreationExpression(arrayType),
                                ObjectCreationExpression(arrayType)
                            )
                        )
                    )
                )
            );
        }