1.1 --- a/src/Array.cpp Sun Aug 05 21:24:41 2012 -0700
1.2 +++ b/src/Array.cpp Mon Aug 06 02:03:36 2012 -0700
1.3 @@ -37,6 +37,27 @@
1.4 return map;
1.5 }
1.6
1.7 +ArrayMap *
1.8 +ArrayMap::Attach(Zone *zone, Handle<Type> type)
1.9 +{
1.10 + if (type->newMap())
1.11 + return ArrayMap::cast(type->newMap());
1.12 +
1.13 + Local<ArrayMap> map(zone, ArrayMap::New(zone, type));
1.14 + if (!map)
1.15 + return NULL;
1.16 +
1.17 + // Ensure the inner type has an ArrayMap if needed.
1.18 + if (type->contained()->isArray()) {
1.19 + Local<Type> contained(zone, type->contained());
1.20 + if (!ArrayMap::Attach(zone, contained))
1.21 + return NULL;
1.22 + }
1.23 +
1.24 + type->setNewMap(map);
1.25 + return map;
1.26 +}
1.27 +
1.28 static inline size_t
1.29 SizeFor(Type *type, unsigned elements)
1.30 {
1.31 @@ -89,6 +110,18 @@
1.32 }
1.33
1.34 Array *
1.35 +Array::NewString(Zone *zone, Handle<ArrayMap> map, Address buffer, size_t length, Heap::Tenure tenure)
1.36 +{
1.37 + Local<Array> array(zone, Array::New(zone, map, length, tenure));
1.38 + if (!array)
1.39 + return NULL;
1.40 +
1.41 + assert(array->length() >= length);
1.42 + memcpy(array->chars(), buffer, length);
1.43 + return array;
1.44 +}
1.45 +
1.46 +Array *
1.47 Array::NewExternal(Zone *zone, Handle<ArrayMap> map, uint32 nelements, void *buffer,
1.48 Heap::Tenure tenure)
1.49 {