diff -r bbb498ccb4ac -r 26e3035cdffc src/Types.h --- a/src/Types.h Sat Dec 22 23:18:57 2012 -0800 +++ b/src/Types.h Mon Dec 24 02:49:20 2012 -0800 @@ -57,6 +57,9 @@ // on 64-bit systems), and does not exist in language semantics. PrimitiveType_Native, + // Internal string object. + PrimitiveType_String, + PrimitiveTypes_Total }; @@ -144,7 +147,7 @@ return primitive_; } bool isPod() { - return isPrimitive() || isEnum() || isUnchecked(); + return (isPrimitive() && !isString()) || isEnum() || isUnchecked(); } PrimitiveType pod() { assert(isPod()); @@ -169,11 +172,18 @@ bool isBool() { return isPrimitive() && primitive() == PrimitiveType_Bool; } + bool isString() { + return isPrimitive() && primitive() == PrimitiveType_String; + } bool isExternalArray() { return kind() == EXTERNAL_ARRAY; } bool isTraceable() { - return !isPrimitive(); + return (isPrimitive() && primitive() == PrimitiveType_String) || + isReference() || + isArray() || + isStruct() || + isFunction(); } bool isConst() { assert(isPrimitive() || @@ -250,7 +260,6 @@ static ArrayType *NewExternal(Zone *zone, Handle contained); Type *innermost() { - assert(isArray()); Type *temp = contained(); while (temp->isArray()) temp = ArrayType::cast(temp)->contained(); @@ -261,7 +270,6 @@ return contained_; } bool isFixedLength() { - assert(isArray()); return elements_ > 0; } bool isCharArray() { @@ -273,12 +281,9 @@ return elements_; } unsigned levels() { - assert(isArray()); return levels_; } bool hasInlineElements() { - assert(isArray()); - // We don't allocate traceable elements inline, since there's no // point to the optimization; we're going to be allocating lots of // objects anyway (in theory).