jitcraft/Types.cpp
changeset 87 f8ac2633b4e3
parent 86 32ad0523b309
child 88 fc3f34f928dd
     1.1 --- a/jitcraft/Types.cpp	Tue Jul 24 23:53:34 2012 -0700
     1.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.3 @@ -1,187 +0,0 @@
     1.4 -/*
     1.5 - * Copyright (C) 2012 David Anderson
     1.6 - *
     1.7 - * This file is part of JITCraft.
     1.8 - *
     1.9 - * JITCraft is free software: you can redistribute it and/or modify it under
    1.10 - * the terms of the GNU General Public License as published by the Free
    1.11 - * Software Foundation, either version 3 of the License, or (at your option)
    1.12 - * any later version.
    1.13 - * 
    1.14 - * Foobar is distributed in the hope that it will be useful, but WITHOUT ANY
    1.15 - * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
    1.16 - * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
    1.17 - *
    1.18 - * You should have received a copy of the GNU General Public License along with
    1.19 - * JITCraft. If not, see http://www.gnu.org/licenses/.
    1.20 - */
    1.21 -#include "Types.h"
    1.22 -#include "Zone.h"
    1.23 -#include "Strings.h"
    1.24 -#include "Heap-inl.h"
    1.25 -
    1.26 -using namespace ke;
    1.27 -
    1.28 -Type *
    1.29 -Type::NewVoid(Zone *zone)
    1.30 -{
    1.31 -    Local<Type> type(zone, Type::cast(zone->allocate(MapKind_Type, sizeof(Type), Heap::Tenure_Old)));
    1.32 -    if (!type)
    1.33 -        return NULL;
    1.34 -
    1.35 -    type->kind_ = VOID;
    1.36 -    type->tag_ = NULL;
    1.37 -    type->contained_ = NULL;
    1.38 -    type->returnType_ = NULL;
    1.39 -    type->parameters_ = NULL;
    1.40 -    return type;
    1.41 -}
    1.42 -
    1.43 -Type *
    1.44 -Type::NewPrimitive(Zone *zone, Handle<String> tag)
    1.45 -{
    1.46 -    Local<Type> type(zone, Type::cast(zone->allocate(MapKind_Type, sizeof(Type), Heap::Tenure_Old)));
    1.47 -    if (!type)
    1.48 -        return NULL;
    1.49 -
    1.50 -    type->kind_ = PRIMITIVE;
    1.51 -    type->tag_ = tag;
    1.52 -    type->contained_ = NULL;
    1.53 -    type->returnType_ = NULL;
    1.54 -    type->parameters_ = NULL;
    1.55 -
    1.56 -    if (tag && strcmp(tag->chars(), "Float") == 0)
    1.57 -        type->primitive_ = PrimitiveType_Float;
    1.58 -    else if (tag && strcmp(tag->chars(), "String") == 0)
    1.59 -        type->primitive_ = PrimitiveType_Char;
    1.60 -    else
    1.61 -        type->primitive_ = PrimitiveType_Int32;
    1.62 -    return type;
    1.63 -}
    1.64 -
    1.65 -Type *
    1.66 -Type::NewPrimitive(Zone *zone, PrimitiveType prim)
    1.67 -{
    1.68 -    Local<Type> type(zone, Type::cast(zone->allocate(MapKind_Type, sizeof(Type), Heap::Tenure_Old)));
    1.69 -    if (!type)
    1.70 -        return NULL;
    1.71 -
    1.72 -    type->kind_ = PRIMITIVE;
    1.73 -    type->tag_ = NULL;
    1.74 -    type->contained_ = NULL;
    1.75 -    type->returnType_ = NULL;
    1.76 -    type->parameters_ = NULL;
    1.77 -    type->primitive_ = prim;
    1.78 -    return type;
    1.79 -}
    1.80 -
    1.81 -Type *
    1.82 -Type::NewArray(Zone *zone, Handle<Type> contained, int elements, bool isConst)
    1.83 -{
    1.84 -    Local<Type> type(zone, Type::cast(zone->allocate(MapKind_Type, sizeof(Type), Heap::Tenure_Old)));
    1.85 -    if (!type)
    1.86 -        return NULL;
    1.87 -
    1.88 -    type->kind_ = ARRAY;
    1.89 -    type->tag_ = NULL;
    1.90 -    type->contained_ = contained;
    1.91 -    type->returnType_ = NULL;
    1.92 -    type->parameters_ = NULL;
    1.93 -    type->elements_ = elements;
    1.94 -    if (contained->isPrimitive())
    1.95 -        type->levels_ = 1;
    1.96 -    else
    1.97 -        type->levels_ = contained->levels() + 1;
    1.98 -    type->const_ = isConst;
    1.99 -    return type;
   1.100 -}
   1.101 -
   1.102 -Type *
   1.103 -Type::NewReference(Zone *zone, Handle<Type> contained, bool isConst)
   1.104 -{
   1.105 -    Local<Type> type(zone, Type::cast(zone->allocate(MapKind_Type, sizeof(Type), Heap::Tenure_Old)));
   1.106 -    if (!type)
   1.107 -        return NULL;
   1.108 -
   1.109 -    type->kind_ = REFERENCE;
   1.110 -    type->tag_ = NULL;
   1.111 -    type->contained_ = contained;
   1.112 -    type->returnType_ = NULL;
   1.113 -    type->parameters_ = NULL;
   1.114 -    type->const_ = isConst;
   1.115 -    return type;
   1.116 -}
   1.117 -
   1.118 -Type *
   1.119 -Type::NewFunction(Zone *zone, Handle<Type> returnType, Handle<FixedArray> parameters)
   1.120 -{
   1.121 -    Local<Type> type(zone, Type::cast(zone->allocate(MapKind_Type, sizeof(Type), Heap::Tenure_Old)));
   1.122 -    if (!type)
   1.123 -        return NULL;
   1.124 -
   1.125 -    type->kind_ = FUNCTION;
   1.126 -    type->contained_ = NULL;
   1.127 -    type->returnType_ = returnType;
   1.128 -    type->parameters_ = parameters;
   1.129 -    return type;
   1.130 -}
   1.131 -
   1.132 -Type *
   1.133 -Type::NewNative(Zone *zone, Handle<Type> returnType, Handle<FixedArray> parameters, bool variadic)
   1.134 -{
   1.135 -    Local<Type> type(zone, Type::cast(zone->allocate(MapKind_Type, sizeof(Type), Heap::Tenure_Old)));
   1.136 -    if (!type)
   1.137 -        return NULL;
   1.138 -
   1.139 -    type->kind_ = NATIVE;
   1.140 -    type->contained_ = NULL;
   1.141 -    type->returnType_ = returnType;
   1.142 -    type->parameters_ = parameters;
   1.143 -    type->variadicNative_ = variadic;
   1.144 -    return type;
   1.145 -}
   1.146 -
   1.147 -bool
   1.148 -Type::Compare(Type *left, Type *right)
   1.149 -{
   1.150 -    if (left->kind() != right->kind())
   1.151 -        return false;
   1.152 -
   1.153 -    switch (left->kind()) {
   1.154 -      case Type::PRIMITIVE:
   1.155 -        return (left->primitive() == right->primitive() &&
   1.156 -                left->tag() == right->tag());
   1.157 -
   1.158 -      case Type::ARRAY:
   1.159 -      {
   1.160 -        if (left->levels() != right->levels())
   1.161 -          return false;
   1.162 -        if (left->elements() != right->elements())
   1.163 -          return false;
   1.164 -        return Compare(left->contained(), right->contained());
   1.165 -      }
   1.166 -
   1.167 -      case Type::FUNCTION:
   1.168 -      {
   1.169 -        if (!Compare(left->returnType(), right->returnType()))
   1.170 -            return false;
   1.171 -        if (left->parameters()->length() != right->parameters()->length())
   1.172 -            return false;
   1.173 -        if (left->isNative() != right->isNative())
   1.174 -            return false;
   1.175 -        if (left->isNative() && (left->isNativeVariadic() != right->isNativeVariadic()))
   1.176 -            return false;
   1.177 -        for (unsigned i = 0; i < left->parameters()->length(); i++) {
   1.178 -            Type *leftparam = left->parameterAt(i);
   1.179 -            Type *rightparam = right->parameterAt(i);
   1.180 -            if (!Compare(leftparam, rightparam))
   1.181 -                return false;
   1.182 -        }
   1.183 -        return true;
   1.184 -      }
   1.185 -
   1.186 -      default:
   1.187 -        assert(left->kind() == Type::REFERENCE);
   1.188 -        return Compare(left->contained(), right->contained());
   1.189 -    }
   1.190 -}