Index: src/objects.cc |
diff --git a/src/objects.cc b/src/objects.cc |
index 2e1443ab47ed246fd65e657905f35b21568169ba..06d05f4f2357621f5d4dca9d8cfec52759efbe08 100644 |
--- a/src/objects.cc |
+++ b/src/objects.cc |
@@ -1281,10 +1281,6 @@ void HeapObject::HeapObjectShortPrint(std::ostream& os) { // NOLINT |
os << "<FreeSpace[" << FreeSpace::cast(this)->Size() << "]>"; |
break; |
#define TYPED_ARRAY_SHORT_PRINT(Type, type, TYPE, ctype, size) \ |
- case EXTERNAL_##TYPE##_ARRAY_TYPE: \ |
- os << "<External" #Type "Array[" \ |
- << External##Type##Array::cast(this)->length() << "]>"; \ |
- break; \ |
case FIXED_##TYPE##_ARRAY_TYPE: \ |
os << "<Fixed" #Type "Array[" << Fixed##Type##Array::cast(this)->length() \ |
<< "]>"; \ |
@@ -1508,9 +1504,6 @@ void HeapObject::IterateBody(InstanceType type, int object_size, |
break; |
#define TYPED_ARRAY_CASE(Type, type, TYPE, ctype, size) \ |
- case EXTERNAL_##TYPE##_ARRAY_TYPE: \ |
- break; \ |
- \ |
case FIXED_##TYPE##_ARRAY_TYPE: \ |
reinterpret_cast<FixedTypedArrayBase*>(this) \ |
->FixedTypedArrayBaseIterateBody(v); \ |
@@ -3318,8 +3311,7 @@ MaybeHandle<Object> Object::SetDataProperty(LookupIterator* it, |
Handle<Object> to_assign = value; |
// Convert the incoming value to a number for storing into typed arrays. |
- if (it->IsElement() && (receiver->HasExternalArrayElements() || |
- receiver->HasFixedTypedArrayElements())) { |
+ if (it->IsElement() && receiver->HasFixedTypedArrayElements()) { |
if (!value->IsNumber() && !value->IsUndefined()) { |
ASSIGN_RETURN_ON_EXCEPTION(it->isolate(), to_assign, |
Execution::ToNumber(it->isolate(), value), |
@@ -3431,13 +3423,11 @@ MaybeHandle<Object> Object::AddDataProperty(LookupIterator* it, |
} |
if (FLAG_trace_external_array_abuse && |
- (array->HasExternalArrayElements() || |
- array->HasFixedTypedArrayElements())) { |
+ array->HasFixedTypedArrayElements()) { |
CheckArrayAbuse(array, "typed elements write", it->index(), true); |
} |
- if (FLAG_trace_js_array_abuse && !array->HasExternalArrayElements() && |
- !array->HasFixedTypedArrayElements()) { |
+ if (FLAG_trace_js_array_abuse && !array->HasFixedTypedArrayElements()) { |
CheckArrayAbuse(array, "elements write", it->index(), false); |
} |
} |
@@ -4266,8 +4256,7 @@ MaybeHandle<Object> JSObject::DefineOwnPropertyIgnoreAttributes( |
// Special case: properties of typed arrays cannot be reconfigured to |
// non-writable nor to non-enumerable. |
- if (it->IsElement() && (object->HasExternalArrayElements() || |
- object->HasFixedTypedArrayElements())) { |
+ if (it->IsElement() && object->HasFixedTypedArrayElements()) { |
return RedefineNonconfigurableProperty(it->isolate(), it->GetName(), |
value, STRICT); |
} |
@@ -4850,8 +4839,7 @@ Handle<SeededNumberDictionary> JSObject::GetNormalizedElementDictionary( |
Handle<SeededNumberDictionary> JSObject::NormalizeElements( |
Handle<JSObject> object) { |
- DCHECK(!object->HasExternalArrayElements() && |
- !object->HasFixedTypedArrayElements()); |
+ DCHECK(!object->HasFixedTypedArrayElements()); |
Isolate* isolate = object->GetIsolate(); |
// Find the backing store. |
@@ -5356,7 +5344,6 @@ bool JSObject::ReferencesObject(Object* obj) { |
// Raw pixels and external arrays do not reference other |
// objects. |
#define TYPED_ARRAY_CASE(Type, type, TYPE, ctype, size) \ |
- case EXTERNAL_##TYPE##_ELEMENTS: \ |
case TYPE##_ELEMENTS: \ |
break; |
@@ -5466,8 +5453,7 @@ MaybeHandle<Object> JSObject::PreventExtensions(Handle<JSObject> object) { |
} |
// It's not possible to seal objects with external array elements |
- if (object->HasExternalArrayElements() || |
- object->HasFixedTypedArrayElements()) { |
+ if (object->HasFixedTypedArrayElements()) { |
THROW_NEW_ERROR( |
isolate, NewTypeError(MessageTemplate::kCannotPreventExtExternalArray), |
Object); |
@@ -5560,8 +5546,7 @@ MaybeHandle<Object> JSObject::PreventExtensionsWithTransition( |
} |
// It's not possible to seal or freeze objects with external array elements |
- if (object->HasExternalArrayElements() || |
- object->HasFixedTypedArrayElements()) { |
+ if (object->HasFixedTypedArrayElements()) { |
THROW_NEW_ERROR( |
isolate, NewTypeError(MessageTemplate::kCannotPreventExtExternalArray), |
Object); |
@@ -5830,7 +5815,7 @@ MaybeHandle<JSObject> JSObjectWalkVisitor<ContextObject>::StructureWalk( |
// Deep copy own elements. |
// Pixel elements cannot be created using an object literal. |
- DCHECK(!copy->HasExternalArrayElements()); |
+ DCHECK(!copy->HasFixedTypedArrayElements()); |
switch (kind) { |
case FAST_SMI_ELEMENTS: |
case FAST_ELEMENTS: |
@@ -5892,7 +5877,6 @@ MaybeHandle<JSObject> JSObjectWalkVisitor<ContextObject>::StructureWalk( |
#define TYPED_ARRAY_CASE(Type, type, TYPE, ctype, size) \ |
- case EXTERNAL_##TYPE##_ELEMENTS: \ |
case TYPE##_ELEMENTS: \ |
TYPED_ARRAYS(TYPED_ARRAY_CASE) |
@@ -6295,8 +6279,7 @@ MaybeHandle<Object> JSObject::DefineAccessor(Handle<JSObject> object, |
} |
// Ignore accessors on typed arrays. |
- if (it.IsElement() && (object->HasFixedTypedArrayElements() || |
- object->HasExternalArrayElements())) { |
+ if (it.IsElement() && object->HasFixedTypedArrayElements()) { |
return it.factory()->undefined_value(); |
} |
@@ -6359,8 +6342,7 @@ MaybeHandle<Object> JSObject::SetAccessor(Handle<JSObject> object, |
} |
// Ignore accessors on typed arrays. |
- if (it.IsElement() && (object->HasFixedTypedArrayElements() || |
- object->HasExternalArrayElements())) { |
+ if (it.IsElement() && object->HasFixedTypedArrayElements()) { |
return it.factory()->undefined_value(); |
} |
@@ -6777,13 +6759,10 @@ Handle<Map> Map::CopyAsElementsKind(Handle<Map> map, ElementsKind kind, |
Map* maybe_elements_transition_map = NULL; |
if (flag == INSERT_TRANSITION) { |
maybe_elements_transition_map = map->ElementsTransitionMap(); |
- DCHECK( |
- maybe_elements_transition_map == NULL || |
- ((maybe_elements_transition_map->elements_kind() == |
- DICTIONARY_ELEMENTS || |
- IsExternalArrayElementsKind( |
- maybe_elements_transition_map->elements_kind())) && |
- (kind == DICTIONARY_ELEMENTS || IsExternalArrayElementsKind(kind)))); |
+ DCHECK(maybe_elements_transition_map == NULL || |
+ (maybe_elements_transition_map->elements_kind() == |
+ DICTIONARY_ELEMENTS && |
+ kind == DICTIONARY_ELEMENTS)); |
DCHECK(!IsFastElementsKind(kind) || |
IsMoreGeneralElementsKindTransition(map->elements_kind(), kind)); |
DCHECK(kind != map->elements_kind()); |
@@ -12599,7 +12578,6 @@ int JSObject::GetFastElementsUsage() { |
case SLOW_SLOPPY_ARGUMENTS_ELEMENTS: |
case DICTIONARY_ELEMENTS: |
#define TYPED_ARRAY_CASE(Type, type, TYPE, ctype, size) \ |
- case EXTERNAL_##TYPE##_ELEMENTS: \ |
case TYPE##_ELEMENTS: \ |
TYPED_ARRAYS(TYPED_ARRAY_CASE) |
@@ -13033,7 +13011,6 @@ int JSObject::GetOwnElementKeys(FixedArray* storage, |
} |
#define TYPED_ARRAY_CASE(Type, type, TYPE, ctype, size) \ |
- case EXTERNAL_##TYPE##_ELEMENTS: \ |
case TYPE##_ELEMENTS: \ |
TYPED_ARRAYS(TYPED_ARRAY_CASE) |
@@ -13855,8 +13832,7 @@ Handle<Object> JSObject::PrepareElementsForSort(Handle<JSObject> object, |
JSObject::ValidateElements(object); |
JSObject::SetMapAndElements(object, new_map, fast_elements); |
- } else if (object->HasExternalArrayElements() || |
- object->HasFixedTypedArrayElements()) { |
+ } else if (object->HasFixedTypedArrayElements()) { |
// Typed arrays cannot have holes or undefined elements. |
return handle(Smi::FromInt( |
FixedArrayBase::cast(object->elements())->length()), isolate); |
@@ -13959,7 +13935,6 @@ Handle<Object> JSObject::PrepareElementsForSort(Handle<JSObject> object, |
ExternalArrayType JSTypedArray::type() { |
switch (elements()->map()->instance_type()) { |
#define INSTANCE_TYPE_TO_ARRAY_TYPE(Type, type, TYPE, ctype, size) \ |
- case EXTERNAL_##TYPE##_ARRAY_TYPE: \ |
case FIXED_##TYPE##_ARRAY_TYPE: \ |
return kExternal##Type##Array; |
@@ -13975,9 +13950,9 @@ ExternalArrayType JSTypedArray::type() { |
size_t JSTypedArray::element_size() { |
switch (elements()->map()->instance_type()) { |
-#define INSTANCE_TYPE_TO_ELEMENT_SIZE(Type, type, TYPE, ctype, size) \ |
- case EXTERNAL_##TYPE##_ARRAY_TYPE: \ |
- return size; |
+#define INSTANCE_TYPE_TO_ELEMENT_SIZE(Type, type, TYPE, ctype, size) \ |
+ case FIXED_##TYPE##_ARRAY_TYPE: \ |
+ return size; |
TYPED_ARRAYS(INSTANCE_TYPE_TO_ELEMENT_SIZE) |
#undef INSTANCE_TYPE_TO_ELEMENT_SIZE |
@@ -13995,131 +13970,6 @@ void FixedArray::SetValue(uint32_t index, Object* value) { set(index, value); } |
void FixedDoubleArray::SetValue(uint32_t index, Object* value) { |
set(index, value->Number()); |
} |
- |
- |
-void ExternalUint8ClampedArray::SetValue(uint32_t index, Object* value) { |
- uint8_t clamped_value = 0; |
- if (value->IsSmi()) { |
- int int_value = Smi::cast(value)->value(); |
- if (int_value < 0) { |
- clamped_value = 0; |
- } else if (int_value > 255) { |
- clamped_value = 255; |
- } else { |
- clamped_value = static_cast<uint8_t>(int_value); |
- } |
- } else if (value->IsHeapNumber()) { |
- double double_value = HeapNumber::cast(value)->value(); |
- if (!(double_value > 0)) { |
- // NaN and less than zero clamp to zero. |
- clamped_value = 0; |
- } else if (double_value > 255) { |
- // Greater than 255 clamp to 255. |
- clamped_value = 255; |
- } else { |
- // Other doubles are rounded to the nearest integer. |
- clamped_value = static_cast<uint8_t>(lrint(double_value)); |
- } |
- } else { |
- // Clamp undefined to zero (default). All other types have been |
- // converted to a number type further up in the call chain. |
- DCHECK(value->IsUndefined()); |
- } |
- set(index, clamped_value); |
-} |
- |
- |
-template <typename ExternalArrayClass, typename ValueType> |
-static void ExternalArrayIntSetter(ExternalArrayClass* receiver, uint32_t index, |
- Object* value) { |
- ValueType cast_value = 0; |
- if (value->IsSmi()) { |
- int int_value = Smi::cast(value)->value(); |
- cast_value = static_cast<ValueType>(int_value); |
- } else if (value->IsHeapNumber()) { |
- double double_value = HeapNumber::cast(value)->value(); |
- cast_value = static_cast<ValueType>(DoubleToInt32(double_value)); |
- } else { |
- // Clamp undefined to zero (default). All other types have been |
- // converted to a number type further up in the call chain. |
- DCHECK(value->IsUndefined()); |
- } |
- receiver->set(index, cast_value); |
-} |
- |
- |
-void ExternalInt8Array::SetValue(uint32_t index, Object* value) { |
- ExternalArrayIntSetter<ExternalInt8Array, int8_t>(this, index, value); |
-} |
- |
- |
-void ExternalUint8Array::SetValue(uint32_t index, Object* value) { |
- ExternalArrayIntSetter<ExternalUint8Array, uint8_t>(this, index, value); |
-} |
- |
- |
-void ExternalInt16Array::SetValue(uint32_t index, Object* value) { |
- ExternalArrayIntSetter<ExternalInt16Array, int16_t>(this, index, value); |
-} |
- |
- |
-void ExternalUint16Array::SetValue(uint32_t index, Object* value) { |
- ExternalArrayIntSetter<ExternalUint16Array, uint16_t>(this, index, value); |
-} |
- |
- |
-void ExternalInt32Array::SetValue(uint32_t index, Object* value) { |
- ExternalArrayIntSetter<ExternalInt32Array, int32_t>(this, index, value); |
-} |
- |
- |
-void ExternalUint32Array::SetValue(uint32_t index, Object* value) { |
- uint32_t cast_value = 0; |
- if (value->IsSmi()) { |
- int int_value = Smi::cast(value)->value(); |
- cast_value = static_cast<uint32_t>(int_value); |
- } else if (value->IsHeapNumber()) { |
- double double_value = HeapNumber::cast(value)->value(); |
- cast_value = static_cast<uint32_t>(DoubleToUint32(double_value)); |
- } else { |
- // Clamp undefined to zero (default). All other types have been |
- // converted to a number type further up in the call chain. |
- DCHECK(value->IsUndefined()); |
- } |
- set(index, cast_value); |
-} |
- |
- |
-void ExternalFloat32Array::SetValue(uint32_t index, Object* value) { |
- float cast_value = std::numeric_limits<float>::quiet_NaN(); |
- if (value->IsSmi()) { |
- int int_value = Smi::cast(value)->value(); |
- cast_value = static_cast<float>(int_value); |
- } else if (value->IsHeapNumber()) { |
- double double_value = HeapNumber::cast(value)->value(); |
- cast_value = static_cast<float>(double_value); |
- } else { |
- // Clamp undefined to NaN (default). All other types have been |
- // converted to a number type further up in the call chain. |
- DCHECK(value->IsUndefined()); |
- } |
- set(index, cast_value); |
-} |
- |
- |
-void ExternalFloat64Array::SetValue(uint32_t index, Object* value) { |
- double double_value = std::numeric_limits<double>::quiet_NaN(); |
- if (value->IsNumber()) { |
- double_value = value->Number(); |
- } else { |
- // Clamp undefined to NaN (default). All other types have been |
- // converted to a number type further up in the call chain. |
- DCHECK(value->IsUndefined()); |
- } |
- set(index, double_value); |
-} |
- |
- |
void GlobalObject::InvalidatePropertyCell(Handle<GlobalObject> global, |
Handle<Name> name) { |
DCHECK(!global->HasFastProperties()); |
@@ -15731,21 +15581,6 @@ void JSArrayBuffer::Neuter() { |
} |
-static ElementsKind FixedToExternalElementsKind(ElementsKind elements_kind) { |
- switch (elements_kind) { |
-#define TYPED_ARRAY_CASE(Type, type, TYPE, ctype, size) \ |
- case TYPE##_ELEMENTS: return EXTERNAL_##TYPE##_ELEMENTS; |
- |
- TYPED_ARRAYS(TYPED_ARRAY_CASE) |
-#undef TYPED_ARRAY_CASE |
- |
- default: |
- UNREACHABLE(); |
- return FIRST_EXTERNAL_ARRAY_ELEMENTS_KIND; |
- } |
-} |
- |
- |
Handle<JSArrayBuffer> JSTypedArray::MaterializeArrayBuffer( |
Handle<JSTypedArray> typed_array) { |
@@ -15754,10 +15589,6 @@ Handle<JSArrayBuffer> JSTypedArray::MaterializeArrayBuffer( |
DCHECK(IsFixedTypedArrayElementsKind(map->elements_kind())); |
- Handle<Map> new_map = Map::TransitionElementsTo( |
- map, |
- FixedToExternalElementsKind(map->elements_kind())); |
- |
Handle<FixedTypedArrayBase> fixed_typed_array( |
FixedTypedArrayBase::cast(typed_array->elements())); |
@@ -15774,21 +15605,23 @@ Handle<JSArrayBuffer> JSTypedArray::MaterializeArrayBuffer( |
memcpy(buffer->backing_store(), |
fixed_typed_array->DataPtr(), |
fixed_typed_array->DataSize()); |
- Handle<ExternalArray> new_elements = |
- isolate->factory()->NewExternalArray( |
+ Handle<FixedTypedArrayBase> new_elements = |
+ isolate->factory()->NewFixedTypedArrayWithExternalPointer( |
fixed_typed_array->length(), typed_array->type(), |
static_cast<uint8_t*>(buffer->backing_store())); |
- JSObject::SetMapAndElements(typed_array, new_map, new_elements); |
+ typed_array->set_elements(*new_elements); |
return buffer; |
} |
Handle<JSArrayBuffer> JSTypedArray::GetBuffer() { |
- if (IsExternalArrayElementsKind(map()->elements_kind())) { |
- Handle<Object> result(buffer(), GetIsolate()); |
- return Handle<JSArrayBuffer>::cast(result); |
+ Handle<JSArrayBuffer> array_buffer(JSArrayBuffer::cast(buffer()), |
+ GetIsolate()); |
+ if (array_buffer->was_neutered() || |
+ array_buffer->backing_store() != nullptr) { |
+ return array_buffer; |
} |
Handle<JSTypedArray> self(this); |
return MaterializeArrayBuffer(self); |