dvander@167: /* vim: set ts=4 sw=4 tw=99 et: dvander@167: * dvander@11: * Copyright (C) 2012 David Anderson dvander@11: * dvander@167: * This file is part of SourcePawn. dvander@11: * dvander@167: * SourcePawn is free software: you can redistribute it and/or modify it under dvander@11: * the terms of the GNU General Public License as published by the Free dvander@11: * Software Foundation, either version 3 of the License, or (at your option) dvander@11: * any later version. dvander@11: * dvander@167: * SourcePawn is distributed in the hope that it will be useful, but WITHOUT ANY dvander@11: * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS dvander@11: * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. dvander@11: * dvander@11: * You should have received a copy of the GNU General Public License along with dvander@167: * SourcePawn. If not, see http://www.gnu.org/licenses/. dvander@11: */ dvander@11: #ifndef _include_jitcraft_type_manager_h_ dvander@11: #define _include_jitcraft_type_manager_h_ dvander@11: dvander@11: #include "Barriers.h" dvander@11: #include "Types.h" dvander@240: #include "HashTable.h" dvander@240: #include "AllocatorPolicies.h" dvander@45: #include "VirtualObjectVisitor.h" dvander@11: dvander@59: namespace ke { dvander@11: dvander@54: class String; dvander@54: dvander@11: class TypeManager dvander@11: { dvander@240: struct LookupKey dvander@240: { dvander@240: Handle type; dvander@240: TypeQualifiers quals; dvander@240: dvander@240: LookupKey(Handle type, TypeQualifiers quals) dvander@240: : type(type), dvander@240: quals(quals) dvander@240: { dvander@240: } dvander@240: }; dvander@11: dvander@240: struct Policy dvander@240: { dvander@240: typedef Type * Payload; dvander@240: dvander@240: static uint32 hash(const LookupKey &key) { dvander@240: // We'll need to rehash with moving GC. dvander@240: return HashPointer(key.type); dvander@240: } dvander@240: dvander@240: static bool matches(const LookupKey &key, Type *type) { dvander@240: assert(type->hasTypeQualifiers()); dvander@240: return key.type == type->unqualified() && dvander@240: key.quals == type->quals(); dvander@240: } dvander@240: }; dvander@240: dvander@240: typedef HashTable TypeHashTable; dvander@11: dvander@11: public: dvander@11: TypeManager(Zone *zone); dvander@11: dvander@11: bool initialize(); dvander@11: dvander@11: Type *getPrimitive(PrimitiveType type) { dvander@11: return primitiveTypes_[type]; dvander@11: } dvander@41: dvander@235: Type *getString() { dvander@235: return stringType_; dvander@235: } dvander@71: Type *getVoid() { dvander@71: return voidType_; dvander@71: } dvander@167: Type *getUnchecked() { dvander@167: return uncheckedType_; dvander@167: } dvander@233: ReferenceType *getReference(Handle type, bool isConst); dvander@233: ArrayType *newArray(Handle contained, int elements); dvander@233: ArrayType *newExternalArray(Handle contained); dvander@233: EnumType *newEnum(Handle name); dvander@71: dvander@45: void accept(VirtualObjectVisitor *visitor); dvander@240: void sweep(); dvander@240: dvander@240: Type *qualify(Handle type, TypeQualifiers quals); dvander@240: dvander@240: private: dvander@240: Zone *zone_; dvander@240: dvander@240: // Primitive type cache. dvander@240: Unbarriered voidType_; dvander@240: Unbarriered stringType_; dvander@240: Unbarriered uncheckedType_; dvander@240: Unbarriered primitiveTypes_[PrimitiveTypes_Total]; dvander@240: Unbarriered referenceTypes_[PrimitiveTypes_Total]; dvander@240: dvander@240: TypeHashTable qualTable_; dvander@11: }; dvander@11: dvander@11: } dvander@11: dvander@11: #endif // _include_jitcraft_type_manager_h_