Index: src/heap.cc |
diff --git a/src/heap.cc b/src/heap.cc |
index ea3cef8c4a5983bea9166278c82662cf95cfd724..5e3d75909d6053fea2f9dea5aabc5520fb9e5223 100644 |
--- a/src/heap.cc |
+++ b/src/heap.cc |
@@ -2149,6 +2149,8 @@ class ScavengingVisitor : public StaticVisitorBase { |
table_.Register(kVisitByteArray, &EvacuateByteArray); |
table_.Register(kVisitFixedArray, &EvacuateFixedArray); |
table_.Register(kVisitFixedDoubleArray, &EvacuateFixedDoubleArray); |
+ table_.Register(kVisitFixedTypedArray, &EvacuateFixedTypedArray); |
+ table_.Register(kVisitFixedFloat64Array, &EvacuateFixedFloat64Array); |
table_.Register(kVisitNativeContext, |
&ObjectEvacuationStrategy<POINTER_OBJECT>:: |
@@ -2389,6 +2391,24 @@ class ScavengingVisitor : public StaticVisitorBase { |
} |
+ static inline void EvacuateFixedTypedArray(Map* map, |
+ HeapObject** slot, |
+ HeapObject* object) { |
+ int object_size = reinterpret_cast<FixedTypedArrayBase*>(object)->size(); |
+ EvacuateObject<DATA_OBJECT, kObjectAlignment>( |
+ map, slot, object, object_size); |
+ } |
+ |
+ |
+ static inline void EvacuateFixedFloat64Array(Map* map, |
+ HeapObject** slot, |
+ HeapObject* object) { |
+ int object_size = reinterpret_cast<FixedFloat64Array*>(object)->size(); |
+ EvacuateObject<DATA_OBJECT, kDoubleAlignment>( |
+ map, slot, object, object_size); |
+ } |
+ |
+ |
static inline void EvacuateByteArray(Map* map, |
HeapObject** slot, |
HeapObject* object) { |
@@ -2778,291 +2798,136 @@ bool Heap::CreateInitialMaps() { |
constant_pool_array_map()->set_prototype(null_value()); |
constant_pool_array_map()->set_constructor(null_value()); |
- { MaybeObject* maybe_obj = |
- AllocateMap(FIXED_ARRAY_TYPE, kVariableSizeSentinel); |
- if (!maybe_obj->ToObject(&obj)) return false; |
- } |
- set_fixed_cow_array_map(Map::cast(obj)); |
- ASSERT(fixed_array_map() != fixed_cow_array_map()); |
- |
- { MaybeObject* maybe_obj = |
- AllocateMap(FIXED_ARRAY_TYPE, kVariableSizeSentinel); |
- if (!maybe_obj->ToObject(&obj)) return false; |
- } |
- set_scope_info_map(Map::cast(obj)); |
- |
- { MaybeObject* maybe_obj = AllocateMap(HEAP_NUMBER_TYPE, HeapNumber::kSize); |
- if (!maybe_obj->ToObject(&obj)) return false; |
- } |
- set_heap_number_map(Map::cast(obj)); |
- |
- { MaybeObject* maybe_obj = AllocateMap(SYMBOL_TYPE, Symbol::kSize); |
- if (!maybe_obj->ToObject(&obj)) return false; |
- } |
- set_symbol_map(Map::cast(obj)); |
- |
- { MaybeObject* maybe_obj = AllocateMap(FOREIGN_TYPE, Foreign::kSize); |
- if (!maybe_obj->ToObject(&obj)) return false; |
- } |
- set_foreign_map(Map::cast(obj)); |
- |
- for (unsigned i = 0; i < ARRAY_SIZE(string_type_table); i++) { |
- const StringTypeTable& entry = string_type_table[i]; |
- { MaybeObject* maybe_obj = AllocateMap(entry.type, entry.size); |
- if (!maybe_obj->ToObject(&obj)) return false; |
+ { // Map allocation |
+#define ALLOCATE_MAP(instance_type, size, field_name) \ |
+ { Map* map; \ |
+ if (!AllocateMap((instance_type), size)->To(&map)) return false; \ |
+ set_##field_name##_map(map); \ |
} |
- roots_[entry.index] = Map::cast(obj); |
- } |
- |
- { MaybeObject* maybe_obj = AllocateMap(STRING_TYPE, kVariableSizeSentinel); |
- if (!maybe_obj->ToObject(&obj)) return false; |
- } |
- set_undetectable_string_map(Map::cast(obj)); |
- Map::cast(obj)->set_is_undetectable(); |
- |
- { MaybeObject* maybe_obj = |
- AllocateMap(ASCII_STRING_TYPE, kVariableSizeSentinel); |
- if (!maybe_obj->ToObject(&obj)) return false; |
- } |
- set_undetectable_ascii_string_map(Map::cast(obj)); |
- Map::cast(obj)->set_is_undetectable(); |
- |
- { MaybeObject* maybe_obj = |
- AllocateMap(FIXED_DOUBLE_ARRAY_TYPE, kVariableSizeSentinel); |
- if (!maybe_obj->ToObject(&obj)) return false; |
- } |
- set_fixed_double_array_map(Map::cast(obj)); |
- |
- { MaybeObject* maybe_obj = |
- AllocateMap(BYTE_ARRAY_TYPE, kVariableSizeSentinel); |
- if (!maybe_obj->ToObject(&obj)) return false; |
- } |
- set_byte_array_map(Map::cast(obj)); |
- |
- { MaybeObject* maybe_obj = |
- AllocateMap(FREE_SPACE_TYPE, kVariableSizeSentinel); |
- if (!maybe_obj->ToObject(&obj)) return false; |
- } |
- set_free_space_map(Map::cast(obj)); |
- |
- { MaybeObject* maybe_obj = AllocateByteArray(0, TENURED); |
- if (!maybe_obj->ToObject(&obj)) return false; |
- } |
- set_empty_byte_array(ByteArray::cast(obj)); |
- |
- { MaybeObject* maybe_obj = |
- AllocateMap(EXTERNAL_PIXEL_ARRAY_TYPE, ExternalArray::kAlignedSize); |
- if (!maybe_obj->ToObject(&obj)) return false; |
- } |
- set_external_pixel_array_map(Map::cast(obj)); |
- |
- { MaybeObject* maybe_obj = AllocateMap(EXTERNAL_BYTE_ARRAY_TYPE, |
- ExternalArray::kAlignedSize); |
- if (!maybe_obj->ToObject(&obj)) return false; |
- } |
- set_external_byte_array_map(Map::cast(obj)); |
- |
- { MaybeObject* maybe_obj = AllocateMap(EXTERNAL_UNSIGNED_BYTE_ARRAY_TYPE, |
- ExternalArray::kAlignedSize); |
- if (!maybe_obj->ToObject(&obj)) return false; |
- } |
- set_external_unsigned_byte_array_map(Map::cast(obj)); |
- |
- { MaybeObject* maybe_obj = AllocateMap(EXTERNAL_SHORT_ARRAY_TYPE, |
- ExternalArray::kAlignedSize); |
- if (!maybe_obj->ToObject(&obj)) return false; |
- } |
- set_external_short_array_map(Map::cast(obj)); |
- |
- { MaybeObject* maybe_obj = AllocateMap(EXTERNAL_UNSIGNED_SHORT_ARRAY_TYPE, |
- ExternalArray::kAlignedSize); |
- if (!maybe_obj->ToObject(&obj)) return false; |
- } |
- set_external_unsigned_short_array_map(Map::cast(obj)); |
- |
- { MaybeObject* maybe_obj = AllocateMap(EXTERNAL_INT_ARRAY_TYPE, |
- ExternalArray::kAlignedSize); |
- if (!maybe_obj->ToObject(&obj)) return false; |
- } |
- set_external_int_array_map(Map::cast(obj)); |
- |
- { MaybeObject* maybe_obj = AllocateMap(EXTERNAL_UNSIGNED_INT_ARRAY_TYPE, |
- ExternalArray::kAlignedSize); |
- if (!maybe_obj->ToObject(&obj)) return false; |
- } |
- set_external_unsigned_int_array_map(Map::cast(obj)); |
- |
- { MaybeObject* maybe_obj = AllocateMap(EXTERNAL_FLOAT_ARRAY_TYPE, |
- ExternalArray::kAlignedSize); |
- if (!maybe_obj->ToObject(&obj)) return false; |
- } |
- set_external_float_array_map(Map::cast(obj)); |
- |
- { MaybeObject* maybe_obj = |
- AllocateMap(FIXED_ARRAY_TYPE, kVariableSizeSentinel); |
- if (!maybe_obj->ToObject(&obj)) return false; |
- } |
- set_non_strict_arguments_elements_map(Map::cast(obj)); |
- |
- { MaybeObject* maybe_obj = AllocateMap(EXTERNAL_DOUBLE_ARRAY_TYPE, |
- ExternalArray::kAlignedSize); |
- if (!maybe_obj->ToObject(&obj)) return false; |
- } |
- 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; |
- } |
- set_code_map(Map::cast(obj)); |
- |
- { MaybeObject* maybe_obj = AllocateMap(CELL_TYPE, Cell::kSize); |
- if (!maybe_obj->ToObject(&obj)) return false; |
- } |
- set_cell_map(Map::cast(obj)); |
- { MaybeObject* maybe_obj = AllocateMap(PROPERTY_CELL_TYPE, |
- PropertyCell::kSize); |
- if (!maybe_obj->ToObject(&obj)) return false; |
- } |
- set_global_property_cell_map(Map::cast(obj)); |
+#define ALLOCATE_VARSIZE_MAP(instance_type, field_name) \ |
+ ALLOCATE_MAP(instance_type, kVariableSizeSentinel, field_name) |
- { MaybeObject* maybe_obj = AllocateMap(FILLER_TYPE, kPointerSize); |
- if (!maybe_obj->ToObject(&obj)) return false; |
- } |
- set_one_pointer_filler_map(Map::cast(obj)); |
+ ALLOCATE_VARSIZE_MAP(FIXED_ARRAY_TYPE, fixed_cow_array) |
+ ASSERT(fixed_array_map() != fixed_cow_array_map()); |
- { MaybeObject* maybe_obj = AllocateMap(FILLER_TYPE, 2 * kPointerSize); |
- if (!maybe_obj->ToObject(&obj)) return false; |
- } |
- set_two_pointer_filler_map(Map::cast(obj)); |
+ ALLOCATE_VARSIZE_MAP(FIXED_ARRAY_TYPE, scope_info) |
+ ALLOCATE_MAP(HEAP_NUMBER_TYPE, HeapNumber::kSize, heap_number) |
+ ALLOCATE_MAP(SYMBOL_TYPE, Symbol::kSize, symbol) |
+ ALLOCATE_MAP(FOREIGN_TYPE, Foreign::kSize, foreign) |
- for (unsigned i = 0; i < ARRAY_SIZE(struct_table); i++) { |
- const StructTable& entry = struct_table[i]; |
- { MaybeObject* maybe_obj = AllocateMap(entry.type, entry.size); |
- if (!maybe_obj->ToObject(&obj)) return false; |
+ for (unsigned i = 0; i < ARRAY_SIZE(string_type_table); i++) { |
+ const StringTypeTable& entry = string_type_table[i]; |
+ { MaybeObject* maybe_obj = AllocateMap(entry.type, entry.size); |
+ if (!maybe_obj->ToObject(&obj)) return false; |
+ } |
+ roots_[entry.index] = Map::cast(obj); |
} |
- roots_[entry.index] = Map::cast(obj); |
- } |
- |
- { MaybeObject* maybe_obj = |
- AllocateMap(FIXED_ARRAY_TYPE, kVariableSizeSentinel); |
- if (!maybe_obj->ToObject(&obj)) return false; |
- } |
- set_hash_table_map(Map::cast(obj)); |
- { MaybeObject* maybe_obj = |
- AllocateMap(FIXED_ARRAY_TYPE, kVariableSizeSentinel); |
- if (!maybe_obj->ToObject(&obj)) return false; |
- } |
- set_function_context_map(Map::cast(obj)); |
- |
- { MaybeObject* maybe_obj = |
- AllocateMap(FIXED_ARRAY_TYPE, kVariableSizeSentinel); |
- if (!maybe_obj->ToObject(&obj)) return false; |
- } |
- set_catch_context_map(Map::cast(obj)); |
+ ALLOCATE_VARSIZE_MAP(STRING_TYPE, undetectable_string) |
+ undetectable_string_map()->set_is_undetectable(); |
+ |
+ ALLOCATE_VARSIZE_MAP(ASCII_STRING_TYPE, undetectable_ascii_string); |
+ undetectable_ascii_string_map()->set_is_undetectable(); |
+ |
+ ALLOCATE_VARSIZE_MAP(FIXED_DOUBLE_ARRAY_TYPE, fixed_double_array) |
+ ALLOCATE_VARSIZE_MAP(BYTE_ARRAY_TYPE, byte_array) |
+ ALLOCATE_VARSIZE_MAP(FREE_SPACE_TYPE, free_space) |
+ |
+#define ALLOCATE_EXTERNAL_ARRAY_MAP(TYPE, type) \ |
+ ALLOCATE_MAP(EXTERNAL_##TYPE##_ARRAY_TYPE, ExternalArray::kAlignedSize, \ |
+ external_##type##_array) |
+ |
+ ALLOCATE_EXTERNAL_ARRAY_MAP(PIXEL, pixel) |
+ ALLOCATE_EXTERNAL_ARRAY_MAP(BYTE, byte) |
+ ALLOCATE_EXTERNAL_ARRAY_MAP(UNSIGNED_BYTE, unsigned_byte) |
+ ALLOCATE_EXTERNAL_ARRAY_MAP(SHORT, short) // NOLINT |
+ ALLOCATE_EXTERNAL_ARRAY_MAP(UNSIGNED_SHORT, unsigned_short) |
+ ALLOCATE_EXTERNAL_ARRAY_MAP(INT, int) |
+ ALLOCATE_EXTERNAL_ARRAY_MAP(UNSIGNED_INT, unsigned_int) |
+ ALLOCATE_EXTERNAL_ARRAY_MAP(FLOAT, float) |
+ ALLOCATE_EXTERNAL_ARRAY_MAP(DOUBLE, double) |
+#undef ALLOCATE_EXTERNAL_ARRAY_MAP |
+ |
+ ALLOCATE_VARSIZE_MAP(FIXED_UINT8_ARRAY_TYPE, fixed_uint8_array) |
+ ALLOCATE_VARSIZE_MAP(FIXED_UINT8_CLAMPED_ARRAY_TYPE, |
+ fixed_uint8_clamped_array) |
+ ALLOCATE_VARSIZE_MAP(FIXED_INT8_ARRAY_TYPE, fixed_int8_array) |
+ ALLOCATE_VARSIZE_MAP(FIXED_UINT16_ARRAY_TYPE, fixed_uint16_array) |
+ ALLOCATE_VARSIZE_MAP(FIXED_INT16_ARRAY_TYPE, fixed_int16_array) |
+ ALLOCATE_VARSIZE_MAP(FIXED_UINT32_ARRAY_TYPE, fixed_uint32_array) |
+ ALLOCATE_VARSIZE_MAP(FIXED_INT32_ARRAY_TYPE, fixed_int32_array) |
+ ALLOCATE_VARSIZE_MAP(FIXED_FLOAT32_ARRAY_TYPE, fixed_float32_array) |
+ ALLOCATE_VARSIZE_MAP(FIXED_FLOAT64_ARRAY_TYPE, fixed_float64_array) |
+ |
+ ALLOCATE_VARSIZE_MAP(FIXED_ARRAY_TYPE, non_strict_arguments_elements) |
+ |
+ ALLOCATE_VARSIZE_MAP(CODE_TYPE, code) |
+ |
+ ALLOCATE_MAP(CELL_TYPE, Cell::kSize, cell) |
+ ALLOCATE_MAP(PROPERTY_CELL_TYPE, PropertyCell::kSize, global_property_cell) |
+ ALLOCATE_MAP(FILLER_TYPE, kPointerSize, one_pointer_filler) |
+ ALLOCATE_MAP(FILLER_TYPE, 2 * kPointerSize, two_pointer_filler) |
+ |
+ |
+ for (unsigned i = 0; i < ARRAY_SIZE(struct_table); i++) { |
+ const StructTable& entry = struct_table[i]; |
+ Map* map; |
+ if (!AllocateMap(entry.type, entry.size)->To(&map)) |
+ return false; |
+ roots_[entry.index] = map; |
+ } |
- { MaybeObject* maybe_obj = |
- AllocateMap(FIXED_ARRAY_TYPE, kVariableSizeSentinel); |
- if (!maybe_obj->ToObject(&obj)) return false; |
- } |
- set_with_context_map(Map::cast(obj)); |
+ ALLOCATE_VARSIZE_MAP(FIXED_ARRAY_TYPE, hash_table) |
- { MaybeObject* maybe_obj = |
- AllocateMap(FIXED_ARRAY_TYPE, kVariableSizeSentinel); |
- if (!maybe_obj->ToObject(&obj)) return false; |
- } |
- set_block_context_map(Map::cast(obj)); |
+ ALLOCATE_VARSIZE_MAP(FIXED_ARRAY_TYPE, function_context) |
+ ALLOCATE_VARSIZE_MAP(FIXED_ARRAY_TYPE, catch_context) |
+ ALLOCATE_VARSIZE_MAP(FIXED_ARRAY_TYPE, with_context) |
+ ALLOCATE_VARSIZE_MAP(FIXED_ARRAY_TYPE, block_context) |
+ ALLOCATE_VARSIZE_MAP(FIXED_ARRAY_TYPE, module_context) |
+ ALLOCATE_VARSIZE_MAP(FIXED_ARRAY_TYPE, global_context) |
- { MaybeObject* maybe_obj = |
- AllocateMap(FIXED_ARRAY_TYPE, kVariableSizeSentinel); |
- if (!maybe_obj->ToObject(&obj)) return false; |
- } |
- set_module_context_map(Map::cast(obj)); |
+ ALLOCATE_VARSIZE_MAP(FIXED_ARRAY_TYPE, native_context) |
+ native_context_map()->set_dictionary_map(true); |
+ native_context_map()->set_visitor_id( |
+ StaticVisitorBase::kVisitNativeContext); |
- { MaybeObject* maybe_obj = |
- AllocateMap(FIXED_ARRAY_TYPE, kVariableSizeSentinel); |
- if (!maybe_obj->ToObject(&obj)) return false; |
- } |
- set_global_context_map(Map::cast(obj)); |
+ ALLOCATE_MAP(SHARED_FUNCTION_INFO_TYPE, SharedFunctionInfo::kAlignedSize, |
+ shared_function_info) |
- { MaybeObject* maybe_obj = |
- AllocateMap(FIXED_ARRAY_TYPE, kVariableSizeSentinel); |
- if (!maybe_obj->ToObject(&obj)) return false; |
+ ALLOCATE_MAP(JS_MESSAGE_OBJECT_TYPE, JSMessageObject::kSize, |
+ message_object) |
+ ALLOCATE_MAP(JS_OBJECT_TYPE, JSObject::kHeaderSize + kPointerSize, |
+ external) |
+ external_map()->set_is_extensible(false); |
+#undef ALLOCATE_VARSIZE_MAP |
+#undef ALLOCATE_MAP |
} |
- Map* native_context_map = Map::cast(obj); |
- native_context_map->set_dictionary_map(true); |
- native_context_map->set_visitor_id(StaticVisitorBase::kVisitNativeContext); |
- set_native_context_map(native_context_map); |
- { MaybeObject* maybe_obj = AllocateMap(SHARED_FUNCTION_INFO_TYPE, |
- SharedFunctionInfo::kAlignedSize); |
- if (!maybe_obj->ToObject(&obj)) return false; |
- } |
- set_shared_function_info_map(Map::cast(obj)); |
+ { // Empty arrays |
+ { ByteArray* byte_array; |
+ if (!AllocateByteArray(0, TENURED)->To(&byte_array)) return false; |
+ set_empty_byte_array(byte_array); |
+ } |
- { MaybeObject* maybe_obj = AllocateMap(JS_MESSAGE_OBJECT_TYPE, |
- JSMessageObject::kSize); |
- if (!maybe_obj->ToObject(&obj)) return false; |
- } |
- set_message_object_map(Map::cast(obj)); |
+#define ALLOCATE_EMPTY_EXTERNAL_ARRAY(Type, type) \ |
+ { ExternalArray* obj; \ |
+ if (!AllocateEmptyExternalArray(kExternal##Type##Array)->To(&obj)) \ |
+ return false; \ |
+ set_empty_external_##type##_array(obj); \ |
+ } |
- Map* external_map; |
- { MaybeObject* maybe_obj = |
- AllocateMap(JS_OBJECT_TYPE, JSObject::kHeaderSize + kPointerSize); |
- if (!maybe_obj->To(&external_map)) return false; |
+ ALLOCATE_EMPTY_EXTERNAL_ARRAY(Byte, byte) |
+ ALLOCATE_EMPTY_EXTERNAL_ARRAY(UnsignedByte, unsigned_byte) |
+ ALLOCATE_EMPTY_EXTERNAL_ARRAY(Short, short) // NOLINT |
+ ALLOCATE_EMPTY_EXTERNAL_ARRAY(UnsignedShort, unsigned_short) |
+ ALLOCATE_EMPTY_EXTERNAL_ARRAY(Int, int) |
+ ALLOCATE_EMPTY_EXTERNAL_ARRAY(UnsignedInt, unsigned_int) |
+ ALLOCATE_EMPTY_EXTERNAL_ARRAY(Float, float) |
+ ALLOCATE_EMPTY_EXTERNAL_ARRAY(Double, double) |
+ ALLOCATE_EMPTY_EXTERNAL_ARRAY(Pixel, pixel) |
+#undef ALLOCATE_EMPTY_EXTERNAL_ARRAY |
} |
- external_map->set_is_extensible(false); |
- set_external_map(external_map); |
- |
ASSERT(!InNewSpace(empty_fixed_array())); |
return true; |
} |
@@ -3771,6 +3636,39 @@ Heap::RootListIndex Heap::RootIndexForExternalArrayType( |
} |
+Map* Heap::MapForFixedTypedArray(ExternalArrayType array_type) { |
+ return Map::cast(roots_[RootIndexForFixedTypedArray(array_type)]); |
+} |
+ |
+ |
+Heap::RootListIndex Heap::RootIndexForFixedTypedArray( |
+ ExternalArrayType array_type) { |
+ switch (array_type) { |
+ case kExternalByteArray: |
+ return kFixedInt8ArrayMapRootIndex; |
+ case kExternalUnsignedByteArray: |
+ return kFixedUint8ArrayMapRootIndex; |
+ case kExternalShortArray: |
+ return kFixedInt16ArrayMapRootIndex; |
+ case kExternalUnsignedShortArray: |
+ return kFixedUint16ArrayMapRootIndex; |
+ case kExternalIntArray: |
+ return kFixedInt32ArrayMapRootIndex; |
+ case kExternalUnsignedIntArray: |
+ return kFixedUint32ArrayMapRootIndex; |
+ case kExternalFloatArray: |
+ return kFixedFloat32ArrayMapRootIndex; |
+ case kExternalDoubleArray: |
+ return kFixedFloat64ArrayMapRootIndex; |
+ case kExternalPixelArray: |
+ return kFixedUint8ClampedArrayMapRootIndex; |
+ default: |
+ UNREACHABLE(); |
+ return kUndefinedValueRootIndex; |
+ } |
+} |
+ |
+ |
Heap::RootListIndex Heap::RootIndexForEmptyExternalArray( |
ElementsKind elementsKind) { |
switch (elementsKind) { |
@@ -4029,6 +3927,84 @@ MaybeObject* Heap::AllocateExternalArray(int length, |
return result; |
} |
+static void ForFixedTypedArray(ExternalArrayType array_type, |
+ int* element_size, |
+ ElementsKind* element_kind) { |
+ switch (array_type) { |
+ case kExternalUnsignedByteArray: |
+ *element_size = 1; |
+ *element_kind = UINT8_ELEMENTS; |
+ return; |
+ case kExternalByteArray: |
+ *element_size = 1; |
+ *element_kind = INT8_ELEMENTS; |
+ return; |
+ case kExternalUnsignedShortArray: |
+ *element_size = 2; |
+ *element_kind = UINT16_ELEMENTS; |
+ return; |
+ case kExternalShortArray: |
+ *element_size = 2; |
+ *element_kind = INT16_ELEMENTS; |
+ return; |
+ case kExternalUnsignedIntArray: |
+ *element_size = 4; |
+ *element_kind = UINT32_ELEMENTS; |
+ return; |
+ case kExternalIntArray: |
+ *element_size = 4; |
+ *element_kind = INT32_ELEMENTS; |
+ return; |
+ case kExternalFloatArray: |
+ *element_size = 4; |
+ *element_kind = FLOAT32_ELEMENTS; |
+ return; |
+ case kExternalDoubleArray: |
+ *element_size = 8; |
+ *element_kind = FLOAT64_ELEMENTS; |
+ return; |
+ case kExternalPixelArray: |
+ *element_size = 1; |
+ *element_kind = UINT8_CLAMPED_ELEMENTS; |
+ return; |
+ default: |
+ *element_size = 0; // Bogus |
+ *element_kind = UINT8_ELEMENTS; // Bogus |
+ UNREACHABLE(); |
+ } |
+} |
+ |
+ |
+MaybeObject* Heap::AllocateFixedTypedArray(int length, |
+ ExternalArrayType array_type, |
+ PretenureFlag pretenure) { |
+ int element_size; |
+ ElementsKind elements_kind; |
+ ForFixedTypedArray(array_type, &element_size, &elements_kind); |
+ int size = OBJECT_POINTER_ALIGN( |
+ length * element_size + FixedTypedArrayBase::kDataOffset); |
+#ifndef V8_HOST_ARCH_64_BIT |
+ if (array_type == kExternalDoubleArray) { |
+ size += kPointerSize; |
+ } |
+#endif |
+ AllocationSpace space = SelectSpace(size, OLD_DATA_SPACE, pretenure); |
+ |
+ HeapObject* object; |
+ MaybeObject* maybe_object = AllocateRaw(size, space, OLD_DATA_SPACE); |
+ if (!maybe_object->To(&object)) return maybe_object; |
+ |
+ if (array_type == kExternalDoubleArray) { |
+ object = EnsureDoubleAligned(this, object, size); |
+ } |
+ |
+ FixedTypedArrayBase* elements = |
+ reinterpret_cast<FixedTypedArrayBase*>(object); |
+ elements->set_map(MapForFixedTypedArray(array_type)); |
+ elements->set_length(length); |
+ return elements; |
+} |
+ |
MaybeObject* Heap::CreateCode(const CodeDesc& desc, |
Code::Flags flags, |
@@ -6822,6 +6798,10 @@ void Heap::EnsureWeakObjectToCodeTable() { |
} |
+void Heap::FatalProcessOutOfMemory(const char* location, bool take_snapshot) { |
+ v8::internal::V8::FatalProcessOutOfMemory(location, take_snapshot); |
+} |
+ |
#ifdef DEBUG |
class PrintHandleVisitor: public ObjectVisitor { |