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";