| Index: src/heap.cc
|
| diff --git a/src/heap.cc b/src/heap.cc
|
| index 6a6afc022e54aff302e78a78abf2ecdaaf7dd423..284cc114565a6b2740d7b4939ece02d6d722bdb7 100644
|
| --- a/src/heap.cc
|
| +++ b/src/heap.cc
|
| @@ -2517,6 +2517,54 @@ bool Heap::CreateInitialMaps() {
|
| }
|
| set_external_double_array_map(Map::cast(obj));
|
|
|
| + { MaybeObject* maybe_obj = AllocateEmptyExternalArray(kExternalByteArray);
|
| + if (!maybe_obj->ToObject(&obj)) return false;
|
| + }
|
| + set_empty_external_byte_array(ExternalArray::cast(obj));
|
| +
|
| + { MaybeObject* maybe_obj =
|
| + AllocateEmptyExternalArray(kExternalUnsignedByteArray);
|
| + if (!maybe_obj->ToObject(&obj)) return false;
|
| + }
|
| + set_empty_external_unsigned_byte_array(ExternalArray::cast(obj));
|
| +
|
| + { MaybeObject* maybe_obj = AllocateEmptyExternalArray(kExternalShortArray);
|
| + if (!maybe_obj->ToObject(&obj)) return false;
|
| + }
|
| + set_empty_external_short_array(ExternalArray::cast(obj));
|
| +
|
| + { MaybeObject* maybe_obj = AllocateEmptyExternalArray(
|
| + kExternalUnsignedShortArray);
|
| + if (!maybe_obj->ToObject(&obj)) return false;
|
| + }
|
| + set_empty_external_unsigned_short_array(ExternalArray::cast(obj));
|
| +
|
| + { MaybeObject* maybe_obj = AllocateEmptyExternalArray(kExternalIntArray);
|
| + if (!maybe_obj->ToObject(&obj)) return false;
|
| + }
|
| + set_empty_external_int_array(ExternalArray::cast(obj));
|
| +
|
| + { MaybeObject* maybe_obj =
|
| + AllocateEmptyExternalArray(kExternalUnsignedIntArray);
|
| + if (!maybe_obj->ToObject(&obj)) return false;
|
| + }
|
| + set_empty_external_unsigned_int_array(ExternalArray::cast(obj));
|
| +
|
| + { MaybeObject* maybe_obj = AllocateEmptyExternalArray(kExternalFloatArray);
|
| + if (!maybe_obj->ToObject(&obj)) return false;
|
| + }
|
| + set_empty_external_float_array(ExternalArray::cast(obj));
|
| +
|
| + { MaybeObject* maybe_obj = AllocateEmptyExternalArray(kExternalDoubleArray);
|
| + if (!maybe_obj->ToObject(&obj)) return false;
|
| + }
|
| + set_empty_external_double_array(ExternalArray::cast(obj));
|
| +
|
| + { MaybeObject* maybe_obj = AllocateEmptyExternalArray(kExternalPixelArray);
|
| + if (!maybe_obj->ToObject(&obj)) return false;
|
| + }
|
| + set_empty_external_pixel_array(ExternalArray::cast(obj));
|
| +
|
| { MaybeObject* maybe_obj = AllocateMap(CODE_TYPE, kVariableSizeSentinel);
|
| if (!maybe_obj->ToObject(&obj)) return false;
|
| }
|
| @@ -3248,6 +3296,40 @@ Heap::RootListIndex Heap::RootIndexForExternalArrayType(
|
| }
|
| }
|
|
|
| +Heap::RootListIndex Heap::RootIndexForEmptyExternalArray(
|
| + ElementsKind elementsKind) {
|
| + switch (elementsKind) {
|
| + case EXTERNAL_BYTE_ELEMENTS:
|
| + return kEmptyExternalByteArrayRootIndex;
|
| + case EXTERNAL_UNSIGNED_BYTE_ELEMENTS:
|
| + return kEmptyExternalUnsignedByteArrayRootIndex;
|
| + case EXTERNAL_SHORT_ELEMENTS:
|
| + return kEmptyExternalShortArrayRootIndex;
|
| + case EXTERNAL_UNSIGNED_SHORT_ELEMENTS:
|
| + return kEmptyExternalUnsignedShortArrayRootIndex;
|
| + case EXTERNAL_INT_ELEMENTS:
|
| + return kEmptyExternalIntArrayRootIndex;
|
| + case EXTERNAL_UNSIGNED_INT_ELEMENTS:
|
| + return kEmptyExternalUnsignedIntArrayRootIndex;
|
| + case EXTERNAL_FLOAT_ELEMENTS:
|
| + return kEmptyExternalFloatArrayRootIndex;
|
| + case EXTERNAL_DOUBLE_ELEMENTS:
|
| + return kEmptyExternalDoubleArrayRootIndex;
|
| + case EXTERNAL_PIXEL_ELEMENTS:
|
| + return kEmptyExternalPixelArrayRootIndex;
|
| + default:
|
| + UNREACHABLE();
|
| + return kUndefinedValueRootIndex;
|
| + }
|
| +}
|
| +
|
| +ExternalArray* Heap::EmptyExternalArrayForMap(Map* map) {
|
| + return ExternalArray::cast(
|
| + roots_[RootIndexForEmptyExternalArray(map->elements_kind())]);
|
| +}
|
| +
|
| +
|
| +
|
|
|
| MaybeObject* Heap::NumberFromDouble(double value, PretenureFlag pretenure) {
|
| // We need to distinguish the minus zero value and this cannot be
|
| @@ -4252,7 +4334,8 @@ MaybeObject* Heap::AllocateJSObjectFromMap(Map* map, PretenureFlag pretenure) {
|
| InitializeJSObjectFromMap(JSObject::cast(obj),
|
| FixedArray::cast(properties),
|
| map);
|
| - ASSERT(JSObject::cast(obj)->HasFastElements());
|
| + ASSERT(JSObject::cast(obj)->HasFastElements() ||
|
| + JSObject::cast(obj)->HasExternalArrayElements());
|
| return obj;
|
| }
|
|
|
| @@ -5216,6 +5299,10 @@ MaybeObject* Heap::AllocateEmptyFixedArray() {
|
| return result;
|
| }
|
|
|
| +MaybeObject* Heap::AllocateEmptyExternalArray(ExternalArrayType array_type) {
|
| + return AllocateExternalArray(0, array_type, NULL, TENURED);
|
| +}
|
| +
|
|
|
| MaybeObject* Heap::AllocateRawFixedArray(int length) {
|
| if (length < 0 || length > FixedArray::kMaxLength) {
|
|
|