diff options
Diffstat (limited to 'deps/v8/src/runtime/runtime-array.cc')
-rw-r--r-- | deps/v8/src/runtime/runtime-array.cc | 87 |
1 files changed, 19 insertions, 68 deletions
diff --git a/deps/v8/src/runtime/runtime-array.cc b/deps/v8/src/runtime/runtime-array.cc index d00df71576..fa0d91bf23 100644 --- a/deps/v8/src/runtime/runtime-array.cc +++ b/deps/v8/src/runtime/runtime-array.cc @@ -2,12 +2,14 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "src/v8.h" +#include "src/runtime/runtime-utils.h" #include "src/arguments.h" +#include "src/conversions-inl.h" #include "src/elements.h" +#include "src/factory.h" #include "src/messages.h" -#include "src/runtime/runtime-utils.h" +#include "src/prototype.h" namespace v8 { namespace internal { @@ -133,7 +135,7 @@ class ArrayConcatVisitor { ~ArrayConcatVisitor() { clear_storage(); } void visit(uint32_t i, Handle<Object> elm) { - if (i > JSObject::kMaxElementCount - index_offset_) { + if (i >= JSObject::kMaxElementCount - index_offset_) { set_exceeds_array_limit(true); return; } @@ -154,8 +156,10 @@ class ArrayConcatVisitor { DCHECK(!fast_elements()); Handle<SeededNumberDictionary> dict( SeededNumberDictionary::cast(*storage_)); + // The object holding this backing store has just been allocated, so + // it cannot yet be used as a prototype. Handle<SeededNumberDictionary> result = - SeededNumberDictionary::AtNumberPut(dict, index, elm); + SeededNumberDictionary::AtNumberPut(dict, index, elm, false); if (!result.is_identical_to(dict)) { // Dictionary needed to grow. clear_storage(); @@ -207,8 +211,11 @@ class ArrayConcatVisitor { HandleScope loop_scope(isolate_); Handle<Object> element(current_storage->get(i), isolate_); if (!element->IsTheHole()) { + // The object holding this backing store has just been allocated, so + // it cannot yet be used as a prototype. Handle<SeededNumberDictionary> new_storage = - SeededNumberDictionary::AtNumberPut(slow_storage, i, element); + SeededNumberDictionary::AtNumberPut(slow_storage, i, element, + false); if (!new_storage.is_identical_to(slow_storage)) { slow_storage = loop_scope.CloseAndEscape(new_storage); } @@ -298,7 +305,6 @@ static uint32_t EstimateElementCount(Handle<JSArray> array) { case FAST_SLOPPY_ARGUMENTS_ELEMENTS: case SLOW_SLOPPY_ARGUMENTS_ELEMENTS: #define TYPED_ARRAY_CASE(Type, type, TYPE, ctype, size) \ - case EXTERNAL_##TYPE##_ELEMENTS: \ case TYPE##_ELEMENTS: TYPED_ARRAYS(TYPED_ARRAY_CASE) @@ -418,7 +424,6 @@ static void CollectElementIndices(Handle<JSObject> object, uint32_t range, } #define TYPED_ARRAY_CASE(Type, type, TYPE, ctype, size) \ case TYPE##_ELEMENTS: \ - case EXTERNAL_##TYPE##_ELEMENTS: TYPED_ARRAYS(TYPED_ARRAY_CASE) #undef TYPED_ARRAY_CASE @@ -439,12 +444,8 @@ static void CollectElementIndices(Handle<JSObject> object, uint32_t range, } case FAST_SLOPPY_ARGUMENTS_ELEMENTS: case SLOW_SLOPPY_ARGUMENTS_ELEMENTS: { - MaybeHandle<Object> length_obj = - Object::GetProperty(object, isolate->factory()->length_string()); - double length_num = length_obj.ToHandleChecked()->Number(); - uint32_t length = static_cast<uint32_t>(DoubleToInt32(length_num)); ElementsAccessor* accessor = object->GetElementsAccessor(); - for (uint32_t i = 0; i < length; i++) { + for (uint32_t i = 0; i < range; i++) { if (accessor->HasElement(object, i)) { indices->Add(i); } @@ -472,9 +473,9 @@ static bool IterateElementsSlow(Isolate* isolate, Handle<JSObject> receiver, if (!maybe.IsJust()) return false; if (maybe.FromJust()) { Handle<Object> element_value; - ASSIGN_RETURN_ON_EXCEPTION_VALUE( - isolate, element_value, - Runtime::GetElementOrCharAt(isolate, receiver, i), false); + ASSIGN_RETURN_ON_EXCEPTION_VALUE(isolate, element_value, + Object::GetElement(isolate, receiver, i), + false); visitor->visit(i, element_value); } } @@ -610,15 +611,6 @@ static bool IterateElements(Isolate* isolate, Handle<JSObject> receiver, } break; } - case EXTERNAL_UINT8_CLAMPED_ELEMENTS: { - Handle<ExternalUint8ClampedArray> pixels( - ExternalUint8ClampedArray::cast(receiver->elements())); - for (uint32_t j = 0; j < length; j++) { - Handle<Smi> e(Smi::FromInt(pixels->get_scalar(j)), isolate); - visitor->visit(j, e); - } - break; - } case UINT8_CLAMPED_ELEMENTS: { Handle<FixedUint8ClampedArray> pixels( FixedUint8ClampedArray::cast(receiver->elements())); @@ -628,81 +620,41 @@ static bool IterateElements(Isolate* isolate, Handle<JSObject> receiver, } break; } - case EXTERNAL_INT8_ELEMENTS: { - IterateTypedArrayElements<ExternalInt8Array, int8_t>( - isolate, receiver, true, true, visitor); - break; - } case INT8_ELEMENTS: { IterateTypedArrayElements<FixedInt8Array, int8_t>( isolate, receiver, true, true, visitor); break; } - case EXTERNAL_UINT8_ELEMENTS: { - IterateTypedArrayElements<ExternalUint8Array, uint8_t>( - isolate, receiver, true, true, visitor); - break; - } case UINT8_ELEMENTS: { IterateTypedArrayElements<FixedUint8Array, uint8_t>( isolate, receiver, true, true, visitor); break; } - case EXTERNAL_INT16_ELEMENTS: { - IterateTypedArrayElements<ExternalInt16Array, int16_t>( - isolate, receiver, true, true, visitor); - break; - } case INT16_ELEMENTS: { IterateTypedArrayElements<FixedInt16Array, int16_t>( isolate, receiver, true, true, visitor); break; } - case EXTERNAL_UINT16_ELEMENTS: { - IterateTypedArrayElements<ExternalUint16Array, uint16_t>( - isolate, receiver, true, true, visitor); - break; - } case UINT16_ELEMENTS: { IterateTypedArrayElements<FixedUint16Array, uint16_t>( isolate, receiver, true, true, visitor); break; } - case EXTERNAL_INT32_ELEMENTS: { - IterateTypedArrayElements<ExternalInt32Array, int32_t>( - isolate, receiver, true, false, visitor); - break; - } case INT32_ELEMENTS: { IterateTypedArrayElements<FixedInt32Array, int32_t>( isolate, receiver, true, false, visitor); break; } - case EXTERNAL_UINT32_ELEMENTS: { - IterateTypedArrayElements<ExternalUint32Array, uint32_t>( - isolate, receiver, true, false, visitor); - break; - } case UINT32_ELEMENTS: { IterateTypedArrayElements<FixedUint32Array, uint32_t>( isolate, receiver, true, false, visitor); break; } - case EXTERNAL_FLOAT32_ELEMENTS: { - IterateTypedArrayElements<ExternalFloat32Array, float>( - isolate, receiver, false, false, visitor); - break; - } case FLOAT32_ELEMENTS: { IterateTypedArrayElements<FixedFloat32Array, float>( isolate, receiver, false, false, visitor); break; } - case EXTERNAL_FLOAT64_ELEMENTS: { - IterateTypedArrayElements<ExternalFloat64Array, double>( - isolate, receiver, false, false, visitor); - break; - } case FLOAT64_ELEMENTS: { IterateTypedArrayElements<FixedFloat64Array, double>( isolate, receiver, false, false, visitor); @@ -1113,8 +1065,8 @@ static Object* ArrayConstructorCommon(Isolate* isolate, allocation_site = site; } - array = Handle<JSArray>::cast(factory->NewJSObjectFromMap( - initial_map, NOT_TENURED, true, allocation_site)); + array = Handle<JSArray>::cast( + factory->NewJSObjectFromMap(initial_map, NOT_TENURED, allocation_site)); } else { array = Handle<JSArray>::cast(factory->NewJSObject(constructor)); @@ -1233,8 +1185,7 @@ RUNTIME_FUNCTION(Runtime_NormalizeElements) { HandleScope scope(isolate); DCHECK(args.length() == 1); CONVERT_ARG_HANDLE_CHECKED(JSObject, array, 0); - RUNTIME_ASSERT(!array->HasExternalArrayElements() && - !array->HasFixedTypedArrayElements() && + RUNTIME_ASSERT(!array->HasFixedTypedArrayElements() && !array->IsJSGlobalProxy()); JSObject::NormalizeElements(array); return *array; |