Index: src/hydrogen.cc |
diff --git a/src/hydrogen.cc b/src/hydrogen.cc |
index abfe9cab2b307826353dcff2bde76cb104a56c90..f4bd4179790f34409068a04ce518c46c6ecca4c7 100644 |
--- a/src/hydrogen.cc |
+++ b/src/hydrogen.cc |
@@ -2416,7 +2416,9 @@ |
KeyedAccessStoreMode store_mode) { |
DCHECK(top_info()->IsStub() || checked_object->IsCompareMap() || |
checked_object->IsCheckMaps()); |
- DCHECK(!IsFixedTypedArrayElementsKind(elements_kind) || !is_js_array); |
+ DCHECK((!IsExternalArrayElementsKind(elements_kind) && |
+ !IsFixedTypedArrayElementsKind(elements_kind)) || |
+ !is_js_array); |
// No GVNFlag is necessary for ElementsKind if there is an explicit dependency |
// on a HElementsTransition instruction. The flag can also be removed if the |
// map to check has FAST_HOLEY_ELEMENTS, since there can be no further |
@@ -2447,17 +2449,24 @@ |
} |
length->set_type(HType::Smi()); |
HValue* checked_key = NULL; |
- if (IsFixedTypedArrayElementsKind(elements_kind)) { |
+ if (IsExternalArrayElementsKind(elements_kind) || |
+ IsFixedTypedArrayElementsKind(elements_kind)) { |
checked_object = Add<HCheckArrayBufferNotNeutered>(checked_object); |
- HValue* external_pointer = Add<HLoadNamedField>( |
- elements, nullptr, |
- HObjectAccess::ForFixedTypedArrayBaseExternalPointer()); |
- HValue* base_pointer = Add<HLoadNamedField>( |
- elements, nullptr, HObjectAccess::ForFixedTypedArrayBaseBasePointer()); |
- HValue* backing_store = AddUncasted<HAdd>( |
- external_pointer, base_pointer, Strength::WEAK, AddOfExternalAndTagged); |
- |
+ HValue* backing_store; |
+ if (IsExternalArrayElementsKind(elements_kind)) { |
+ backing_store = Add<HLoadNamedField>( |
+ elements, nullptr, HObjectAccess::ForExternalArrayExternalPointer()); |
+ } else { |
+ HValue* external_pointer = Add<HLoadNamedField>( |
+ elements, nullptr, |
+ HObjectAccess::ForFixedTypedArrayBaseExternalPointer()); |
+ HValue* base_pointer = Add<HLoadNamedField>( |
+ elements, nullptr, |
+ HObjectAccess::ForFixedTypedArrayBaseBasePointer()); |
+ backing_store = AddUncasted<HAdd>(external_pointer, base_pointer, |
+ Strength::WEAK, AddOfExternalAndTagged); |
+ } |
if (store_mode == STORE_NO_TRANSITION_IGNORE_OUT_OF_BOUNDS) { |
NoObservableSideEffectsScope no_effects(this); |
IfBuilder length_checker(this); |
@@ -2689,7 +2698,8 @@ |
LoadKeyedHoleMode load_mode) { |
if (access_type == STORE) { |
DCHECK(val != NULL); |
- if (elements_kind == UINT8_CLAMPED_ELEMENTS) { |
+ if (elements_kind == EXTERNAL_UINT8_CLAMPED_ELEMENTS || |
+ elements_kind == UINT8_CLAMPED_ELEMENTS) { |
val = Add<HClampToUint8>(val); |
} |
return Add<HStoreKeyed>(elements, checked_key, val, elements_kind, |
@@ -2700,7 +2710,8 @@ |
DCHECK(val == NULL); |
HLoadKeyed* load = Add<HLoadKeyed>( |
elements, checked_key, dependency, elements_kind, load_mode); |
- if (elements_kind == UINT32_ELEMENTS) { |
+ if (elements_kind == EXTERNAL_UINT32_ELEMENTS || |
+ elements_kind == UINT32_ELEMENTS) { |
graph()->RecordUint32Instruction(load); |
} |
return load; |
@@ -7402,6 +7413,7 @@ |
val)); |
} else { |
DCHECK(IsFastElementsKind(elements_kind) || |
+ IsExternalArrayElementsKind(elements_kind) || |
IsFixedTypedArrayElementsKind(elements_kind)); |
LoadKeyedHoleMode load_mode = BuildKeyedHoleMode(map); |
// Happily, mapcompare is a checked object. |
@@ -9936,14 +9948,14 @@ |
bool is_zero_byte_offset, |
HValue* buffer, HValue* byte_offset, HValue* length) { |
Handle<Map> external_array_map( |
- isolate()->heap()->MapForFixedTypedArray(array_type)); |
+ isolate()->heap()->MapForExternalArrayType(array_type)); |
// The HForceRepresentation is to prevent possible deopt on int-smi |
// conversion after allocation but before the new object fields are set. |
length = AddUncasted<HForceRepresentation>(length, Representation::Smi()); |
- HValue* elements = Add<HAllocate>( |
- Add<HConstant>(FixedTypedArrayBase::kHeaderSize), HType::HeapObject(), |
- NOT_TENURED, external_array_map->instance_type()); |
+ HValue* elements = |
+ Add<HAllocate>(Add<HConstant>(ExternalArray::kSize), HType::HeapObject(), |
+ NOT_TENURED, external_array_map->instance_type()); |
AddStoreMapConstant(elements, external_array_map); |
Add<HStoreNamedField>(elements, |
@@ -9965,11 +9977,8 @@ |
} |
Add<HStoreNamedField>(elements, |
- HObjectAccess::ForFixedTypedArrayBaseBasePointer(), |
- graph()->GetConstant0()); |
- Add<HStoreNamedField>(elements, |
- HObjectAccess::ForFixedTypedArrayBaseExternalPointer(), |
- typed_array_start); |
+ HObjectAccess::ForExternalArrayExternalPointer(), |
+ typed_array_start); |
return elements; |
} |
@@ -10116,10 +10125,13 @@ |
ExternalArrayType array_type = |
kExternalInt8Array; // Bogus initialization. |
size_t element_size = 1; // Bogus initialization. |
+ ElementsKind external_elements_kind = // Bogus initialization. |
+ EXTERNAL_INT8_ELEMENTS; |
ElementsKind fixed_elements_kind = // Bogus initialization. |
INT8_ELEMENTS; |
Runtime::ArrayIdToTypeAndSize(array_id, |
&array_type, |
+ &external_elements_kind, |
&fixed_elements_kind, |
&element_size); |
@@ -10144,8 +10156,8 @@ |
if (buffer != NULL) { |
elements = BuildAllocateExternalElements( |
array_type, is_zero_byte_offset, buffer, byte_offset, length); |
- Handle<Map> obj_map = |
- TypedArrayMap(isolate(), array_type, fixed_elements_kind); |
+ Handle<Map> obj_map = TypedArrayMap( |
+ isolate(), array_type, external_elements_kind); |
AddStoreMapConstant(obj, obj_map); |
} else { |
DCHECK(is_zero_byte_offset); |