src/Array.cpp
changeset 169 0456a16c2a63
parent 154 a85a0303bcb8
child 184 387d76b1e981
     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  {