diff -r 4d0fff61d65e -r 0456a16c2a63 src/Array.cpp --- a/src/Array.cpp Sun Aug 05 21:24:41 2012 -0700 +++ b/src/Array.cpp Mon Aug 06 02:03:36 2012 -0700 @@ -37,6 +37,27 @@ return map; } +ArrayMap * +ArrayMap::Attach(Zone *zone, Handle type) +{ + if (type->newMap()) + return ArrayMap::cast(type->newMap()); + + Local map(zone, ArrayMap::New(zone, type)); + if (!map) + return NULL; + + // Ensure the inner type has an ArrayMap if needed. + if (type->contained()->isArray()) { + Local contained(zone, type->contained()); + if (!ArrayMap::Attach(zone, contained)) + return NULL; + } + + type->setNewMap(map); + return map; +} + static inline size_t SizeFor(Type *type, unsigned elements) { @@ -89,6 +110,18 @@ } Array * +Array::NewString(Zone *zone, Handle map, Address buffer, size_t length, Heap::Tenure tenure) +{ + Local array(zone, Array::New(zone, map, length, tenure)); + if (!array) + return NULL; + + assert(array->length() >= length); + memcpy(array->chars(), buffer, length); + return array; +} + +Array * Array::NewExternal(Zone *zone, Handle map, uint32 nelements, void *buffer, Heap::Tenure tenure) {