# HG changeset patch # User David Anderson # Date 1356483727 28800 # Node ID 572668ef742b5361b4d5335fec834353e0aea54d # Parent e9bec7549c28c839562106c50f856e8ae3e06944 More const preparation: allow type casts to follow qualification. diff -r e9bec7549c28 -r 572668ef742b src/Types.cpp --- a/src/Types.cpp Tue Dec 25 16:32:06 2012 -0800 +++ b/src/Types.cpp Tue Dec 25 17:02:07 2012 -0800 @@ -87,7 +87,7 @@ return NULL; } - Local type(zone, ArrayType::cast(zone->allocate(MapKind_ArrayType, sizeof(ArrayType), Heap::Tenure_Old))); + Local type(zone, (ArrayType *)zone->allocate(MapKind_ArrayType, sizeof(ArrayType), Heap::Tenure_Old)); if (!type) return NULL; @@ -104,7 +104,7 @@ ArrayType * ArrayType::NewExternal(Zone *zone, Handle contained) { - Local type(zone, ArrayType::cast(zone->allocate(MapKind_ArrayType, sizeof(ArrayType), Heap::Tenure_Old))); + Local type(zone, (ArrayType *)zone->allocate(MapKind_ArrayType, sizeof(ArrayType), Heap::Tenure_Old)); if (!type) return NULL; @@ -120,7 +120,7 @@ ReferenceType * ReferenceType::New(Zone *zone, Handle contained) { - Local type(zone, ReferenceType::cast(zone->allocate(MapKind_ReferenceType, sizeof(ReferenceType), Heap::Tenure_Old))); + Local type(zone, (ReferenceType *)zone->allocate(MapKind_ReferenceType, sizeof(ReferenceType), Heap::Tenure_Old)); if (!type) return NULL; @@ -132,7 +132,7 @@ EnumType * EnumType::New(Zone *zone, Handle name) { - Local type(zone, EnumType::cast(zone->allocate(MapKind_EnumType, sizeof(EnumType), Heap::Tenure_Old))); + Local type(zone, (EnumType *)zone->allocate(MapKind_EnumType, sizeof(EnumType), Heap::Tenure_Old)); if (!type) return NULL; @@ -144,7 +144,7 @@ StructType * StructType::New(Zone *zone, Handle name, Handle fields) { - Local type(zone, StructType::cast(zone->allocate(MapKind_StructType, sizeof(StructType), Heap::Tenure_Old))); + Local type(zone, (StructType *)zone->allocate(MapKind_StructType, sizeof(StructType), Heap::Tenure_Old)); if (!type) return NULL; @@ -193,7 +193,7 @@ FunctionType * FunctionType::New(Zone *zone, Handle name, TokenKind token) { - Local type(zone, FunctionType::cast(zone->allocate(MapKind_FunctionType, sizeof(FunctionType), Heap::Tenure_Old))); + Local type(zone, (FunctionType *)zone->allocate(MapKind_FunctionType, sizeof(FunctionType), Heap::Tenure_Old)); if (!type) return NULL; diff -r e9bec7549c28 -r 572668ef742b src/Types.h --- a/src/Types.h Tue Dec 25 16:32:06 2012 -0800 +++ b/src/Types.h Tue Dec 25 17:02:07 2012 -0800 @@ -113,7 +113,11 @@ // int32, float, bool, or an enum. UNCHECKED, - // ------ Add traceable types below ------- + // Contains type qualifiers, and a back pointer to the actual + // unqualified type. + QUALTYPE, + + // ------ Add traceable types below (STRING FIRST!) ------- // An immutable type that is a primitive in terms of language // semantics, but gets a special type here to make internal @@ -133,11 +137,7 @@ // Structs are composite records that may contain primitives, arrays, // functions, enums, and other structs. - STRUCT, - - // Contains type qualifiers, and a back pointer to the actual - // unqualified type. - QUALTYPE + STRUCT }; void init(Kind kind); @@ -236,6 +236,9 @@ return TypeQual_None; return quals_; } + Type *unqualified() { + return root_; + } // GC Descriptor. static inline size_t offsetOfRoot() { @@ -292,8 +295,11 @@ } // End GC Descriptor. - static ReferenceType *cast(Object *obj) { - assert(!obj || obj->is(MapKind_ReferenceType)); + static ReferenceType *cast(Type *obj) { + if (!obj) + return NULL; + obj = obj->unqualified(); + assert(obj->is(MapKind_ReferenceType)); return (ReferenceType *)obj; } @@ -358,8 +364,11 @@ } // End GC Descriptor. - static ArrayType *cast(Object *obj) { - assert(!obj || obj->is(MapKind_ArrayType)); + static ArrayType *cast(Type *obj) { + if (!obj) + return NULL; + obj = obj->unqualified(); + assert(obj->is(MapKind_ArrayType)); return (ArrayType *)obj; } @@ -406,8 +415,11 @@ } // End GC Descriptor. - static StructType *cast(Object *obj) { - assert(!obj || obj->is(MapKind_StructType)); + static StructType *cast(Type *obj) { + if (!obj) + return NULL; + obj = obj->unqualified(); + assert(obj->is(MapKind_StructType)); return (StructType *)obj; } @@ -478,8 +490,11 @@ } // End GC Descriptor. - static FunctionType *cast(Object *obj) { - assert(!obj || obj->is(MapKind_FunctionType)); + static FunctionType *cast(Type *obj) { + if (!obj) + return NULL; + obj = obj->unqualified(); + assert(obj->is(MapKind_FunctionType)); return (FunctionType *)obj; }