in SharpGen/Generator/Marshallers/StringMarshaller.cs [224:291]
private static SyntaxToken LengthVariableName(CsMarshalBase marshallable) =>
Identifier($"{marshallable.Name}_length");
private StatementSyntax GenerateAnsiStringToArray(CsMarshalBase marshallable)
{
var lengthIdentifier = LengthVariableName(marshallable);
return Block(
LocalDeclarationStatement(
VariableDeclaration(
TypeInt32,
SingletonSeparatedList(
VariableDeclarator(lengthIdentifier)
.WithInitializer(EqualsValueClause(
InvocationExpression(MemberAccessExpression(SyntaxKind.SimpleMemberAccessExpression,
GlobalNamespace.GetTypeNameSyntax(BuiltinType.Math),
IdentifierName(nameof(Math.Min))),
ArgumentList(
SeparatedList(
new[]
{
Argument(
GeneratorHelpers.OptionalLengthExpression(IdentifierName(marshallable.Name))
),
Argument(
LiteralExpression(SyntaxKind.NumericLiteralExpression,
Literal(marshallable.ArrayDimensionValue - 1))
)
}
)
))))))),
LocalDeclarationStatement(
VariableDeclaration(
IntPtrType,
SingletonSeparatedList(
VariableDeclarator(Identifier(FromIdentifier))
.WithInitializer(EqualsValueClause(
InvocationExpression(MemberAccessExpression(SyntaxKind.SimpleMemberAccessExpression,
GlobalNamespace.GetTypeNameSyntax(BuiltinType.Marshal),
IdentifierName(nameof(Marshal.StringToHGlobalAnsi))))
.WithArgumentList(
ArgumentList(SingletonSeparatedList(Argument(IdentifierName(marshallable.Name)))))))))),
FixedStatement(
VariableDeclaration(
PointerType(PredefinedType(Token(SyntaxKind.ByteKeyword))),
SingletonSeparatedList(
VariableDeclarator(ToIdentifier)
.WithInitializer(EqualsValueClause(
PrefixUnaryExpression(SyntaxKind.AddressOfExpression,
GetMarshalStorageLocation(marshallable)))))
),
Block(
GenerateCopyMemoryInvocation(IdentifierName(lengthIdentifier), castFrom: false),
ExpressionStatement(
AssignmentExpression(SyntaxKind.SimpleAssignmentExpression,
ElementAccessExpression(IdentifierName(ToIdentifier),
BracketedArgumentList(
SingletonSeparatedList(
Argument(IdentifierName(lengthIdentifier))))),
ZeroLiteral)))),
ExpressionStatement(InvocationExpression(
MemberAccessExpression(SyntaxKind.SimpleMemberAccessExpression,
GlobalNamespace.GetTypeNameSyntax(BuiltinType.Marshal),
IdentifierName(nameof(Marshal.FreeHGlobal))),
ArgumentList(SingletonSeparatedList(
Argument(IdentifierName(FromIdentifier))))))
);
}