示例#1
0
 internal Builder([DisallowNull] ES_InterfaceData *data, ES_AccessModifier accessMod,
                  ES_FullyQualifiedName fullyQualifiedName, ArrayPointer <byte> sourceUnit
                  )
 {
     InterfaceData  = data;
     data->TypeInfo = new ES_TypeInfo(ES_TypeTag.Interface, accessMod, ES_TypeFlag.NoNew, sourceUnit, fullyQualifiedName);
 }
示例#2
0
        public ES_ClassData.Builder GetOrCreateClass(ES_AccessModifier accessMod,
                                                     ArrayPointer <byte> name, ArrayPointer <byte> sourceUnit
                                                     )
        {
            CheckDisposed();

            if (CheckTypeExists(name, ES_TypeTag.Class) != null)
            {
                throw new CompilationException(ES_FrontendErrors.ClashingTypeExists);
            }

            if (ClassBuilders.TryGetValue(name, out var builder))
            {
                return(builder);
            }

            var classDataPtr = envBuilder.MemoryManager.GetMemory <ES_ClassData> ();

            builder = new ES_ClassData.Builder(classDataPtr, accessMod, new ES_FullyQualifiedName(NamespaceName, name), sourceUnit);
            ClassBuilders.Add(name, builder);
            NamespaceData.types.Add(&classDataPtr->TypeInfo);

            var unknType = NamespaceData.environment.TypeUnknownValue;

            builder.BaseClass      = (ES_ClassData *)unknType;
            builder.InterfacesList = ArrayPointer <Pointer <ES_InterfaceData> > .Null;

            return(builder);
        }
示例#3
0
 public ES_MemberData_Variable(
     ArrayPointer <byte> name, ArrayPointer <byte> srcUnit, ES_AccessModifier accessMod,
     ES_MemberFlags flags, int offset, ES_TypeInfo *type
     )
 {
     Info   = new ES_MemberData(accessMod, ES_MemberType.Field, flags, name, srcUnit);
     Offset = offset;
     Type   = type;
 }
示例#4
0
    public ES_FunctionPrototypeData(ES_AccessModifier accessMod,
                                    ES_TypeInfo *retType, ArrayPointer <ES_FunctionPrototypeArgData> argsList,
                                    ES_FullyQualifiedName fullyQualifiedName, ArrayPointer <byte> sourceUnit
                                    )
    {
        TypeInfo             = new (ES_TypeTag.Function, accessMod, ES_TypeFlag.NoNew, sourceUnit, fullyQualifiedName);
        TypeInfo.RuntimeSize = IntPtr.Size;

        returnType    = retType;
        argumentsList = argsList;
    }
示例#5
0
 public ES_MemberData_Function(
     ES_MemberFlags flags, ES_FullyQualifiedName fqn,
     ES_AccessModifier accessMod, ArrayPointer <byte> srcUnit,
     ES_FunctionPrototypeData *funcType, ArrayPointer <ES_FunctionArgData> args, int optArgCount
     )
 {
     Info         = new ES_MemberData(accessMod, ES_MemberType.Field, flags, fqn.TypeName, srcUnit);
     FunctionData = new ES_FunctionData(
         fqn, accessMod, srcUnit,
         funcType, args, optArgCount
         );
 }
示例#6
0
 public ES_MemberData(
     ES_AccessModifier accessMod,
     ES_MemberType type, ES_MemberFlags flags,
     ArrayPointer <byte> name, ArrayPointer <byte> srcUnit
     )
 {
     AccessModifier = accessMod;
     MemberType     = type;
     Flags          = flags;
     Name           = name;
     SourceUnit     = srcUnit;
 }
示例#7
0
    public ES_FloatTypeData(
        ES_AccessModifier accessMod, ArrayPointer <byte> sourceUnit, ES_FullyQualifiedName fullyQualifiedName,
        ES_FloatSize size
        )
    {
        TypeInfo = new ES_TypeInfo(ES_TypeTag.Float, accessMod, ES_TypeFlag.NoRefs, sourceUnit, fullyQualifiedName);

        FloatSize = size;

        TypeInfo.RuntimeSize = size switch {
            ES_FloatSize.Single => 4,
            ES_FloatSize.Double => 8,

            _ => throw new NotImplementedException("Size not implemented."),
        };
    }
示例#8
0
    public ES_FunctionData(
        ES_FullyQualifiedName fqn, ES_AccessModifier accessMod, ArrayPointer <byte> sourceUnit,
        ES_FunctionPrototypeData *functionType, ArrayPointer <ES_FunctionArgData> args, int optArgCount
        )
    {
        Debug.Assert(functionType is not null);
        Debug.Assert(args.Length == functionType->ArgumentsList.Length);

        Name = fqn;

        AccessModifier = accessMod;
        SourceUnit     = sourceUnit;

        FunctionType      = functionType;
        Arguments         = args;
        OptionalArgsCount = optArgCount;
    }
示例#9
0
    public ES_TypeInfo(
        ES_TypeTag typeTag, ES_AccessModifier accessMod, ES_TypeFlag flags,
        ArrayPointer <byte> sourceUnit,
        ES_FullyQualifiedName fullyQualifiedName
        )
    {
        TypeTag     = typeTag;
        RuntimeSize = -1;

        AccessModifier = accessMod;
        Flags          = flags;

        Name       = fullyQualifiedName;
        SourceUnit = sourceUnit;

        RefsList    = ArrayPointer <nint> .Null;
        MembersList = new ES_TypeMembers();
    }
示例#10
0
    public ES_IntTypeData(
        ES_AccessModifier accessMod, ArrayPointer <byte> sourceUnit, ES_FullyQualifiedName fullyQualifiedName,
        ES_IntSize size, bool unsigned
        )
    {
        TypeInfo = new ES_TypeInfo(ES_TypeTag.Int, accessMod, ES_TypeFlag.NoRefs, sourceUnit, fullyQualifiedName);

        IntSize  = size;
        Unsigned = unsigned;

        TypeInfo.RuntimeSize = size switch {
            ES_IntSize.Int8 => 1,
            ES_IntSize.Int16 => 2,
            ES_IntSize.Int32 => 4,
            ES_IntSize.Int64 => 8,

            _ => throw new NotImplementedException("Size not implemented."),
        };
    }
示例#11
0
        public ES_EnumData.Builder GetOrCreateEnum(ES_AccessModifier accessMod,
                                                   ArrayPointer <byte> name, ArrayPointer <byte> sourceUnit
                                                   )
        {
            CheckDisposed();

            if (CheckTypeExists(name, ES_TypeTag.Enum) != null)
            {
                throw new CompilationException(ES_FrontendErrors.ClashingTypeExists);
            }

            if (EnumBuilders.TryGetValue(name, out var builder))
            {
                return(builder);
            }

            var enumDataPtr = envBuilder.MemoryManager.GetMemory <ES_EnumData> ();

            builder = new ES_EnumData.Builder(enumDataPtr, accessMod, new ES_FullyQualifiedName(NamespaceName, name), sourceUnit);
            EnumBuilders.Add(name, builder);
            NamespaceData.types.Add(&enumDataPtr->TypeInfo);

            return(builder);
        }