Mercurial > projects > dil
diff src/dil/semantic/Types.d @ 806:bcb74c9b895c
Moved out files in the trunk folder to the root.
author | Aziz K?ksal <aziz.koeksal@gmail.com> |
---|---|
date | Sun, 09 Mar 2008 00:12:19 +0100 |
parents | trunk/src/dil/semantic/Types.d@9e6c6bb73e5f |
children | 1d06b4aed7cf |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/dil/semantic/Types.d Sun Mar 09 00:12:19 2008 +0100 @@ -0,0 +1,403 @@ +/++ + Author: Aziz Köksal + License: GPL3 ++/ +module dil.semantic.Types; + +import dil.semantic.Symbol; +import dil.semantic.TypesEnum; +import dil.lexer.Identifier; +import dil.CompilerInfo; + +/// The base type for all type structures. +abstract class Type/* : Symbol*/ +{ + Type next; /// The next type in the type structure. + TYP tid; /// The ID of the type. + Symbol symbol; /// Not null if this type has a symbol. + + this(){} + + /// Constructs a Type object. + /// Params: + /// next = the type's next type. + /// tid = the type's ID. + this(Type next, TYP tid) + { +// this.sid = SYM.Type; + + this.next = next; + this.tid = tid; + } + + /// Returns a pointer type to this type. + TypePointer ptrTo() + { + return new TypePointer(this); + } + + /// Returns a dynamic array type using this type as its base. + TypeDArray arrayOf() + { + return new TypeDArray(this); + } + + /// Returns an associative array type using this type as its base. + /// Params: + /// key = the key type. + TypeAArray arrayOf(Type key) + { + return new TypeAArray(this, key); + } + + /// Returns the byte size of this type. + final size_t sizeOf() + { + return MITable.getSize(this); + } + + /// Size is not in MITable. Find out via virtual method. + size_t sizeOf_() + { + return sizeOf(); + } + + /// Returns true if this type has a symbol. + bool hasSymbol() + { + return symbol !is null; + } +} + +/// All basic types. E.g.: int, char, real etc. +class TypeBasic : Type +{ + this(TYP typ) + { + super(null, typ); + } +} + +/// Dynamic array type. +class TypeDArray : Type +{ + this(Type next) + { + super(next, TYP.DArray); + } +} + +/// Associative array type. +class TypeAArray : Type +{ + Type keyType; + this(Type next, Type keyType) + { + super(next, TYP.AArray); + this.keyType = keyType; + } +} + +/// Static array type. +class TypeSArray : Type +{ + size_t dimension; + this(Type next, size_t dimension) + { + super(next, TYP.SArray); + this.dimension = dimension; + } +} + +/// Pointer type. +class TypePointer : Type +{ + this(Type next) + { + super(next, TYP.Pointer); + } +} + +/// Reference type. +class TypeReference : Type +{ + this(Type next) + { + super(next, TYP.Reference); + } +} + +/// Enum type. +class TypeEnum : Type +{ + this(Symbol symbol, Type baseType) + { + super(baseType, TYP.Enum); + this.symbol = symbol; + } + + Type baseType() + { + return next; + } +} + +/// Struct type. +class TypeStruct : Type +{ + this(Symbol symbol) + { + super(null, TYP.Struct); + this.symbol = symbol; + } +} + +/// Class type. +class TypeClass : Type +{ + this(Symbol symbol) + { + super(null, TYP.Class); + this.symbol = symbol; + } +} + +/// Typedef type. +class TypeTypedef : Type +{ + this(Type next) + { + super(next, TYP.Typedef); + } +} + +/// Function type. +class TypeFunction : Type +{ + this(Type next) + { + super(next, TYP.Function); + } +} + +/// Delegate type. +class TypeDelegate : Type +{ + this(Type next) + { + super(next, TYP.Delegate); + } +} + +/// Identifier type. +class TypeIdentifier : Type +{ + Identifier* ident; + this(Identifier* ident) + { + super(null, TYP.Identifier); + } +} + +/// Template instantiation type. +class TypeTemplInstance : Type +{ + this() + { + super(null, TYP.TInstance); + } +} + +/// Template tuple type. +class TypeTuple : Type +{ + this(Type next) + { + super(next, TYP.Tuple); + } +} + +/// Constant type. D2.0 +class TypeConst : Type +{ + this(Type next) + { + super(next, TYP.Const); + } +} + +/// Invariant type. D2.0 +class TypeInvariant : Type +{ + this(Type next) + { + super(next, TYP.Const); + } +} + +/// Represents a value related to a Type. +union Value +{ + void* pvoid; + bool bool_; + dchar dchar_; + long long_; + ulong ulong_; + int int_; + uint uint_; + float float_; + double double_; + real real_; + creal creal_; +} + +/// Information related to a Type. +struct TypeMetaInfo +{ + char mangle; /// Mangle character of the type. + ushort size; /// Byte size of the type. + Value* defaultInit; /// Default initialization value. +} + +/// Namespace for the meta info table. +struct MITable +{ +static: + const ushort SIZE_NOT_AVAILABLE = 0; /// Size not available. + const Value VZERO = {int_:0}; /// Value 0. + const Value VNULL = {pvoid:null}; /// Value null. + const Value V0xFF = {dchar_:0xFF}; /// Value 0xFF. + const Value V0xFFFF = {dchar_:0xFFFF}; /// Value 0xFFFF. + const Value VFALSE = {bool_:false}; /// Value false. + const Value VNAN = {float_:float.nan}; /// Value NAN. + const Value VCNAN = {creal_:creal.nan}; /// Value complex NAN. + private alias SIZE_NOT_AVAILABLE SNA; + private alias PTR_SIZE PS; + /// The meta info table. + private const TypeMetaInfo metaInfoTable[] = [ + {'?', SNA}, // Error + + {'a', 1, &V0xFF}, // Char + {'u', 2, &V0xFFFF}, // Wchar + {'w', 4, &V0xFFFF}, // Dchar + {'b', 1, &VFALSE}, // Bool + {'g', 1, &VZERO}, // Byte + {'h', 1, &VZERO}, // Ubyte + {'s', 2, &VZERO}, // Short + {'t', 2, &VZERO}, // Ushort + {'i', 4, &VZERO}, // Int + {'k', 4, &VZERO}, // Uint + {'l', 8, &VZERO}, // Long + {'m', 8, &VZERO}, // Ulong + {'?', 16, &VZERO}, // Cent + {'?', 16, &VZERO}, // Ucent + {'f', 4, &VNAN}, // Float + {'d', 8, &VNAN}, // Double + {'e', 12, &VNAN}, // Real + {'o', 4, &VNAN}, // Ifloat + {'p', 8, &VNAN}, // Idouble + {'j', 12, &VNAN}, // Ireal + {'q', 8, &VCNAN}, // Cfloat + {'r', 16, &VCNAN}, // Cdouble + {'c', 24, &VCNAN}, // Creal + {'v', 1}, // void + + {'n', SNA}, // None + + {'A', PS*2, &VNULL}, // Dynamic array + {'G', PS*2, &VNULL}, // Static array + {'H', PS*2, &VNULL}, // Associative array + + {'E', SNA}, // Enum + {'S', SNA}, // Struct + {'C', PS, &VNULL}, // Class + {'T', SNA}, // Typedef + {'F', PS}, // Function + {'D', PS*2, &VNULL}, // Delegate + {'P', PS, &VNULL}, // Pointer + {'R', PS, &VNULL}, // Reference + {'I', SNA}, // Identifier + {'?', SNA}, // Template instance + {'B', SNA}, // Tuple + {'x', SNA}, // Const, D2 + {'y', SNA}, // Invariant, D2 + ]; + static assert(metaInfoTable.length == TYP.max+1); + + /// Returns the size of a type. + size_t getSize(Type type) + { + auto size = metaInfoTable[type.tid].size; + if (size == SIZE_NOT_AVAILABLE) + return type.sizeOf_(); + return size; + } +} + +/// Namespace for a set of predefined types. +struct Types +{ +static: + /// Predefined basic types. + TypeBasic Char, Wchar, Dchar, Bool, + Byte, Ubyte, Short, Ushort, + Int, Uint, Long, Ulong, + Cent, Ucent, + Float, Double, Real, + Ifloat, Idouble, Ireal, + Cfloat, Cdouble, Creal, Void; + + TypeBasic Size_t; /// The size type. + TypeBasic Ptrdiff_t; /// The pointer difference type. + TypePointer Void_ptr; /// The void pointer type. + TypeBasic Error; /// The error type. + TypeBasic Undefined; /// The undefined type. + + /// Allocates an instance of TypeBasic and assigns it to typeName. + template newTB(char[] typeName) + { + const newTB = mixin(typeName~" = new TypeBasic(TYP."~typeName~")"); + } + + /// Initializes predefined types. + static this() + { + newTB!("Char"); + newTB!("Wchar"); + newTB!("Dchar"); + newTB!("Bool"); + newTB!("Byte"); + newTB!("Ubyte"); + newTB!("Short"); + newTB!("Ushort"); + newTB!("Int"); + newTB!("Uint"); + newTB!("Long"); + newTB!("Ulong"); + newTB!("Cent"); + newTB!("Ucent"); + newTB!("Float"); + newTB!("Double"); + newTB!("Real"); + newTB!("Ifloat"); + newTB!("Idouble"); + newTB!("Ireal"); + newTB!("Cfloat"); + newTB!("Cdouble"); + newTB!("Creal"); + newTB!("Void"); + version(X86_64) + { + Size_t = Ulong; + Ptrdiff_t = Long; + } + else + { + Size_t = Uint; + Ptrdiff_t = Int; + } + Void_ptr = Void.ptrTo; + Error = new TypeBasic(TYP.Error); + Undefined = new TypeBasic(TYP.Error); + } +}