| Index: src/heap.cc
|
| ===================================================================
|
| --- src/heap.cc (revision 3095)
|
| +++ src/heap.cc (working copy)
|
| @@ -1218,6 +1218,41 @@
|
| if (obj->IsFailure()) return false;
|
| set_pixel_array_map(Map::cast(obj));
|
|
|
| + obj = AllocateMap(EXTERNAL_BYTE_ARRAY_TYPE,
|
| + ExternalArray::kAlignedSize);
|
| + if (obj->IsFailure()) return false;
|
| + set_external_byte_array_map(Map::cast(obj));
|
| +
|
| + obj = AllocateMap(EXTERNAL_UNSIGNED_BYTE_ARRAY_TYPE,
|
| + ExternalArray::kAlignedSize);
|
| + if (obj->IsFailure()) return false;
|
| + set_external_unsigned_byte_array_map(Map::cast(obj));
|
| +
|
| + obj = AllocateMap(EXTERNAL_SHORT_ARRAY_TYPE,
|
| + ExternalArray::kAlignedSize);
|
| + if (obj->IsFailure()) return false;
|
| + set_external_short_array_map(Map::cast(obj));
|
| +
|
| + obj = AllocateMap(EXTERNAL_UNSIGNED_SHORT_ARRAY_TYPE,
|
| + ExternalArray::kAlignedSize);
|
| + if (obj->IsFailure()) return false;
|
| + set_external_unsigned_short_array_map(Map::cast(obj));
|
| +
|
| + obj = AllocateMap(EXTERNAL_INT_ARRAY_TYPE,
|
| + ExternalArray::kAlignedSize);
|
| + if (obj->IsFailure()) return false;
|
| + set_external_int_array_map(Map::cast(obj));
|
| +
|
| + obj = AllocateMap(EXTERNAL_UNSIGNED_INT_ARRAY_TYPE,
|
| + ExternalArray::kAlignedSize);
|
| + if (obj->IsFailure()) return false;
|
| + set_external_unsigned_int_array_map(Map::cast(obj));
|
| +
|
| + obj = AllocateMap(EXTERNAL_FLOAT_ARRAY_TYPE,
|
| + ExternalArray::kAlignedSize);
|
| + if (obj->IsFailure()) return false;
|
| + set_external_float_array_map(Map::cast(obj));
|
| +
|
| obj = AllocateMap(CODE_TYPE, Code::kHeaderSize);
|
| if (obj->IsFailure()) return false;
|
| set_code_map(Map::cast(obj));
|
| @@ -1638,6 +1673,35 @@
|
| }
|
|
|
|
|
| +Map* Heap::MapForExternalArrayType(ExternalArrayType array_type) {
|
| + return Map::cast(roots_[RootIndexForExternalArrayType(array_type)]);
|
| +}
|
| +
|
| +
|
| +Heap::RootListIndex Heap::RootIndexForExternalArrayType(
|
| + ExternalArrayType array_type) {
|
| + switch (array_type) {
|
| + case kExternalByteArray:
|
| + return kExternalByteArrayMapRootIndex;
|
| + case kExternalUnsignedByteArray:
|
| + return kExternalUnsignedByteArrayMapRootIndex;
|
| + case kExternalShortArray:
|
| + return kExternalShortArrayMapRootIndex;
|
| + case kExternalUnsignedShortArray:
|
| + return kExternalUnsignedShortArrayMapRootIndex;
|
| + case kExternalIntArray:
|
| + return kExternalIntArrayMapRootIndex;
|
| + case kExternalUnsignedIntArray:
|
| + return kExternalUnsignedIntArrayMapRootIndex;
|
| + case kExternalFloatArray:
|
| + return kExternalFloatArrayMapRootIndex;
|
| + default:
|
| + UNREACHABLE();
|
| + return kUndefinedValueRootIndex;
|
| + }
|
| +}
|
| +
|
| +
|
| Object* Heap::NewNumberFromDouble(double value, PretenureFlag pretenure) {
|
| return SmiOrNumberFromDouble(value,
|
| true /* number object must be new */,
|
| @@ -1963,6 +2027,31 @@
|
| }
|
|
|
|
|
| +Object* Heap::AllocateExternalArray(int length,
|
| + ExternalArrayType array_type,
|
| + void* external_pointer,
|
| + PretenureFlag pretenure) {
|
| + AllocationSpace space = (pretenure == TENURED) ? OLD_DATA_SPACE : NEW_SPACE;
|
| +
|
| + // New space can't cope with forced allocation.
|
| + if (always_allocate()) space = OLD_DATA_SPACE;
|
| +
|
| + Object* result = AllocateRaw(ExternalArray::kAlignedSize,
|
| + space,
|
| + OLD_DATA_SPACE);
|
| +
|
| + if (result->IsFailure()) return result;
|
| +
|
| + reinterpret_cast<ExternalArray*>(result)->set_map(
|
| + MapForExternalArrayType(array_type));
|
| + reinterpret_cast<ExternalArray*>(result)->set_length(length);
|
| + reinterpret_cast<ExternalArray*>(result)->set_external_pointer(
|
| + external_pointer);
|
| +
|
| + return result;
|
| +}
|
| +
|
| +
|
| Object* Heap::CreateCode(const CodeDesc& desc,
|
| ZoneScopeInfo* sinfo,
|
| Code::Flags flags,
|
|
|