src/Types.cpp
changeset 209 5cbec15fadfe
parent 195 c1ba166f3fc4
child 212 443d24cfdf2d
     1.1 --- a/src/Types.cpp	Sat Nov 17 22:02:08 2012 -0800
     1.2 +++ b/src/Types.cpp	Sat Nov 17 23:11:38 2012 -0800
     1.3 @@ -33,7 +33,6 @@
     1.4          return NULL;
     1.5  
     1.6      type->kind_ = VOID;
     1.7 -    type->contained_ = NULL;
     1.8      return type;
     1.9  }
    1.10  
    1.11 @@ -45,7 +44,6 @@
    1.12          return NULL;
    1.13  
    1.14      type->kind_ = UNCHECKED;
    1.15 -    type->contained_ = NULL;
    1.16      return type;
    1.17  }
    1.18  
    1.19 @@ -58,15 +56,14 @@
    1.20  
    1.21      type->kind_ = PRIMITIVE;
    1.22      type->name_ = NULL;
    1.23 -    type->contained_ = NULL;
    1.24 -    type->primitive_ = prim;
    1.25 +     type->primitive_ = prim;
    1.26      return type;
    1.27  }
    1.28  
    1.29 -Type *
    1.30 -Type::NewArray(Zone *zone, Handle<Type> contained, int elements, bool isConst)
    1.31 +ArrayType *
    1.32 +ArrayType::New(Zone *zone, Handle<Type> contained, int elements)
    1.33  {
    1.34 -    Local<Type> type(zone, Type::cast(zone->allocate(MapKind_Type, sizeof(Type), Heap::Tenure_Old)));
    1.35 +    Local<ArrayType> type(zone, ArrayType::cast(zone->allocate(MapKind_ArrayType, sizeof(ArrayType), Heap::Tenure_Old)));
    1.36      if (!type)
    1.37          return NULL;
    1.38  
    1.39 @@ -77,15 +74,14 @@
    1.40      if (!contained->isArray())
    1.41          type->levels_ = 1;
    1.42      else
    1.43 -        type->levels_ = contained->levels() + 1;
    1.44 -    type->const_ = isConst;
    1.45 +        type->levels_ = ArrayType::cast(contained)->levels() + 1;
    1.46      return type;
    1.47  }
    1.48  
    1.49 -Type *
    1.50 -Type::NewExternalArray(Zone *zone, Handle<Type> contained)
    1.51 +ArrayType *
    1.52 +ArrayType::NewExternal(Zone *zone, Handle<Type> contained)
    1.53  {
    1.54 -    Local<Type> type(zone, Type::cast(zone->allocate(MapKind_Type, sizeof(Type), Heap::Tenure_Old)));
    1.55 +    Local<ArrayType> type(zone, ArrayType::cast(zone->allocate(MapKind_ArrayType, sizeof(ArrayType), Heap::Tenure_Old)));
    1.56      if (!type)
    1.57          return NULL;
    1.58  
    1.59 @@ -96,7 +92,6 @@
    1.60      type->contained_ = contained;
    1.61      type->elements_ = DYNAMIC_ARRAY_SIZE;
    1.62      type->levels_ = 1;
    1.63 -    type->const_ = false;
    1.64      return type;
    1.65  }
    1.66  
    1.67 @@ -109,7 +104,6 @@
    1.68  
    1.69      type->kind_ = REFERENCE;
    1.70      type->name_ = NULL;
    1.71 -    type->contained_ = contained;
    1.72      type->const_ = isConst;
    1.73      return type;
    1.74  }
    1.75 @@ -123,7 +117,6 @@
    1.76  
    1.77      type->kind_ = ENUM;
    1.78      type->name_ = name;
    1.79 -    type->contained_ = NULL;
    1.80      return type;
    1.81  }
    1.82  
    1.83 @@ -164,11 +157,15 @@
    1.84  
    1.85        case Type::ARRAY:
    1.86        {
    1.87 -        if (left->levels() != right->levels())
    1.88 -          return false;
    1.89 -        if (left->elements_ != right->elements_)
    1.90 +        ArrayType *aleft = ArrayType::cast(left);
    1.91 +        ArrayType *aright = ArrayType::cast(right);
    1.92 +        if (aleft->levels() != aright->levels())
    1.93              return false;
    1.94 -        return Compare(left->contained(), right->contained());
    1.95 +        if (aleft->isFixedLength() != aright->isFixedLength())
    1.96 +            return false;
    1.97 +        if (aleft->isFixedLength() && aleft->fixedLength() != aright->fixedLength())
    1.98 +            return false;
    1.99 +        return Compare(aleft->contained(), aright->contained());
   1.100        }
   1.101  
   1.102        case Type::FUNCTION:
   1.103 @@ -200,7 +197,7 @@
   1.104  
   1.105        default:
   1.106          assert(left->kind() == Type::REFERENCE);
   1.107 -        return Compare(left->contained(), right->contained());
   1.108 +        return Compare(left->contained_ref(), right->contained_ref());
   1.109      }
   1.110  }
   1.111  
   1.112 @@ -214,7 +211,6 @@
   1.113  
   1.114      type->kind_ = STRUCT;
   1.115      type->name_ = name;
   1.116 -    type->contained_ = NULL;
   1.117      type->newMap_ = NULL;
   1.118      type->fields_ = fields;
   1.119  
   1.120 @@ -264,7 +260,6 @@
   1.121  
   1.122      type->kind_ = FUNCTION;
   1.123      type->name_ = NULL;
   1.124 -    type->contained_ = NULL;
   1.125      type->parameters_ = NULL;
   1.126      type->defaults_ = NULL;
   1.127      type->returnType_ = NULL;
   1.128 @@ -285,7 +280,7 @@
   1.129      if (type->isEnum() || type->isStruct())
   1.130          return type->name()->chars();
   1.131      if (type->isReference())
   1.132 -        type = type->contained();
   1.133 +        type = type->contained_ref();
   1.134      switch (type->primitive()) {
   1.135        case PrimitiveType_Bool:
   1.136          return "bool";