Esempio n. 1
0
    private void GenerateTypesList()
    {
        foreach (var nmKVP in EnvironmentBuilder !.NamespaceBuilders)
        {
            var namespaceName    = nmKVP.Key;
            var namespaceBuilder = nmKVP.Value;
            var namespaceData    = namespaceBuilder.NamespaceData;

            using var newTypesList = new StructPooledList <Pointer <ES_TypeInfo> > (CL_ClearMode.Auto);

            newTypesList.EnsureCapacity(
                namespaceBuilder.ClassBuilders.Count +
                namespaceBuilder.StructBuilders.Count +
                namespaceBuilder.EnumBuilders.Count
                );

            foreach (var classKVP in namespaceBuilder.ClassBuilders)
            {
                var classBuilder = classKVP.Value;
                newTypesList.Add(&classBuilder.ClassData->TypeInfo);
            }
            foreach (var structKVP in namespaceBuilder.StructBuilders)
            {
                var structBuilder = structKVP.Value;
                newTypesList.Add(&structBuilder.StructData->TypeInfo);
            }
            foreach (var enumKVP in namespaceBuilder.EnumBuilders)
            {
                var enumBuilder = enumKVP.Value;
                newTypesList.Add(&enumBuilder.EnumData->TypeInfo);
            }
        }
    }
Esempio n. 2
0
    private static ExpressionSyntax CompileCode_NewObject(ES_TypeInfo *type, ExpressionSyntax?assignValue)
    {
        var isReference = type->TypeTag == ES_TypeTag.Reference;

        // Get the roslyn type.
        var intPtrType = IdentifierName(nameof(IntPtr));
        var roslynType = GetRoslynType(type);

        // Generate the member access.
        var accessExpr = MemberAccessExpression(SyntaxKind.SimpleMemberAccessExpression,
                                                IdentifierName(nameof(ES_GarbageCollector)),
                                                GenericName(Identifier(nameof(ES_GarbageCollector.AllocObject))).WithTypeArgumentList(
                                                    TypeArgumentList(SingletonSeparatedList(!isReference ? roslynType : intPtrType))
                                                    )
                                                );

        // Construct the args list.
        using var argsList = new StructPooledList <SyntaxNodeOrToken> (CL_ClearMode.Auto);
        argsList.EnsureCapacity(3);

        // Generate the pointer type syntax for the type pointer.
        var pointerTypeSyntax = PointerType(IdentifierName(nameof(ES_TypeInfo)));

        // Add the type pointer.
        argsList.Add(Argument(PointerLiteral(type, pointerTypeSyntax)));

        // Add the "pinned" bool.
        argsList.Add(Token(SyntaxKind.CommaToken));
        argsList.Add(Argument(BoolLiteral(false)));

        // Add the value to assign.
        if (assignValue is not null)
        {
            argsList.Add(Token(SyntaxKind.CommaToken));
            if (isReference)
            {
                assignValue = CastExpression(intPtrType, assignValue);
            }
            argsList.Add(Argument(assignValue));
        }

        // Generate the function call.
        ExpressionSyntax ret = InvocationExpression(accessExpr)
                               .WithArgumentList(ArgumentList(SeparatedListSpan <ArgumentSyntax> (argsList.Span)));

        if (isReference)
        {
            ret = CastExpression(PointerType(roslynType), ret);
        }

        return(ret);
    }