src/TypeManager.cpp
author David Anderson <dvander@alliedmods.net>
Wed Aug 01 22:32:59 2012 -0700 (2012-08-01)
changeset 145 e9d804821c48
parent 143 393f1b8ac8c3
child 146 dc7d3b7a918c
permissions -rw-r--r--
Introduced type semantics, completely replacing tag semantics.
     1 /* vim: set ts=4 sw=4 tw=99 et:
     2  *
     3  * Copyright (C) 2012 David Anderson
     4  *
     5  * This file is part of JITCraft.
     6  *
     7  * JITCraft is free software: you can redistribute it and/or modify it under
     8  * the terms of the GNU General Public License as published by the Free
     9  * Software Foundation, either version 3 of the License, or (at your option)
    10  * any later version.
    11  * 
    12  * Foobar is distributed in the hope that it will be useful, but WITHOUT ANY
    13  * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
    14  * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
    15  *
    16  * You should have received a copy of the GNU General Public License along with
    17  * JITCraft. If not, see http://www.gnu.org/licenses/.
    18  */
    19 #include <string.h>
    20 #include "Types.h"
    21 #include "TypeManager.h"
    22 #include "Zone.h"
    23 #include "Strings.h"
    24 #include "Spaces-inl.h"
    25 #include "Heap-inl.h"
    26 
    27 using namespace ke;
    28 
    29 
    30 TypeManager::TypeManager(Zone *zone)
    31   : zone_(zone)
    32 {
    33 }
    34 
    35 bool
    36 TypeManager::initialize()
    37 {
    38     voidType_ = Type::NewVoid(zone_);
    39     if (!voidType_)
    40         return false;
    41 
    42     if ((primitiveTypes_[PrimitiveType_Int32] = Type::NewPrimitive(zone_, PrimitiveType_Int32)) == NULL)
    43         return false;
    44     if ((primitiveTypes_[PrimitiveType_Float] = Type::NewPrimitive(zone_, PrimitiveType_Float)) == NULL)
    45         return false;
    46     if ((primitiveTypes_[PrimitiveType_Native] = Type::NewPrimitive(zone_, PrimitiveType_Native)) == NULL)
    47         return false;
    48     if ((primitiveTypes_[PrimitiveType_Char] = Type::NewPrimitive(zone_, PrimitiveType_Char)) == NULL)
    49         return false;
    50     if ((primitiveTypes_[PrimitiveType_Bool] = Type::NewPrimitive(zone_, PrimitiveType_Bool)) == NULL)
    51         return false;
    52 
    53     Local<Type> type(zone_);
    54     for (unsigned i = 0; i < PrimitiveTypes_Total; i++) {
    55         type = primitiveTypes_[i];
    56         if ((referenceTypes_[i] = Type::NewReference(zone_, type, false)) == NULL)
    57             return false;
    58     }
    59 
    60     return true;
    61 }
    62 
    63 Type *
    64 TypeManager::unsafeArray(Handle<Type> contained, int elements, bool isConst)
    65 {
    66     // :TODO: cache this.
    67     return Type::NewArray(zone_, contained, elements, isConst);
    68 }
    69 
    70 Type *
    71 TypeManager::getReference(Handle<Type> type, bool isConst)
    72 {
    73     if (!isConst && type->isPrimitive())
    74         return referenceTypes_[type->primitive()];
    75 
    76     // :TODO: cache this.
    77     return Type::NewReference(zone_, type, isConst);
    78 }
    79 
    80 Type *
    81 TypeManager::newFunction(Handle<Type> returnType, Handle<FixedArray> args)
    82 {
    83     // :TODO: cache this.
    84     return Type::NewFunction(zone_, returnType, args);
    85 }
    86 
    87 Type *
    88 TypeManager::newNative(Handle<Type> returnType, Handle<FixedArray> args, bool variadic)
    89 {
    90     // :TODO: cache this.
    91     return Type::NewNative(zone_, returnType, args, variadic);
    92 }
    93 
    94 Type *
    95 TypeManager::newEnum(Handle<String> name)
    96 {
    97     return Type::NewEnum(zone_, name);
    98 }
    99 
   100 void
   101 TypeManager::accept(VirtualObjectVisitor *visitor)
   102 {
   103     visitor->visit(voidType_.address());
   104     for (unsigned i = 0; i < PrimitiveTypes_Total; i++) {
   105         visitor->visit(primitiveTypes_[i].address());
   106         visitor->visit(referenceTypes_[i].address());
   107     }
   108 }