| Index: src/runtime.cc
|
| diff --git a/src/runtime.cc b/src/runtime.cc
|
| index af9cef575b5a96c46062520aec63226241151c7c..a3c159a47f0b2e1555e59df94c2449472f796405 100644
|
| --- a/src/runtime.cc
|
| +++ b/src/runtime.cc
|
| @@ -208,10 +208,8 @@ MUST_USE_RESULT static MaybeObject* DeepCopyBoilerplate(Isolate* isolate,
|
| // Pixel elements cannot be created using an object literal.
|
| ASSERT(!copy->HasExternalArrayElements());
|
| switch (copy->GetElementsKind()) {
|
| - case FAST_SMI_ELEMENTS:
|
| - case FAST_ELEMENTS:
|
| - case FAST_HOLEY_SMI_ELEMENTS:
|
| - case FAST_HOLEY_ELEMENTS: {
|
| + case FAST_SMI_ONLY_ELEMENTS:
|
| + case FAST_ELEMENTS: {
|
| FixedArray* elements = FixedArray::cast(copy->elements());
|
| if (elements->map() == heap->fixed_cow_array_map()) {
|
| isolate->counters()->cow_arrays_created_runtime()->Increment();
|
| @@ -225,7 +223,7 @@ MUST_USE_RESULT static MaybeObject* DeepCopyBoilerplate(Isolate* isolate,
|
| Object* value = elements->get(i);
|
| ASSERT(value->IsSmi() ||
|
| value->IsTheHole() ||
|
| - (IsFastObjectElementsKind(copy->GetElementsKind())));
|
| + (copy->GetElementsKind() == FAST_ELEMENTS));
|
| if (value->IsJSObject()) {
|
| JSObject* js_object = JSObject::cast(value);
|
| { MaybeObject* maybe_result = DeepCopyBoilerplate(isolate,
|
| @@ -270,7 +268,6 @@ MUST_USE_RESULT static MaybeObject* DeepCopyBoilerplate(Isolate* isolate,
|
| case EXTERNAL_FLOAT_ELEMENTS:
|
| case EXTERNAL_DOUBLE_ELEMENTS:
|
| case FAST_DOUBLE_ELEMENTS:
|
| - case FAST_HOLEY_DOUBLE_ELEMENTS:
|
| // No contained objects, nothing to do.
|
| break;
|
| }
|
| @@ -455,7 +452,7 @@ MaybeObject* TransitionElements(Handle<Object> object,
|
| }
|
|
|
|
|
| -static const int kSmiLiteralMinimumLength = 1024;
|
| +static const int kSmiOnlyLiteralMinimumLength = 1024;
|
|
|
|
|
| Handle<Object> Runtime::CreateArrayLiteralBoilerplate(
|
| @@ -473,22 +470,23 @@ Handle<Object> Runtime::CreateArrayLiteralBoilerplate(
|
| Handle<FixedArrayBase> constant_elements_values(
|
| FixedArrayBase::cast(elements->get(1)));
|
|
|
| - ASSERT(IsFastElementsKind(constant_elements_kind));
|
| Context* global_context = isolate->context()->global_context();
|
| - Object* maybe_maps_array = global_context->js_array_maps();
|
| - ASSERT(!maybe_maps_array->IsUndefined());
|
| - Object* maybe_map = FixedArray::cast(maybe_maps_array)->get(
|
| - constant_elements_kind);
|
| - ASSERT(maybe_map->IsMap());
|
| - object->set_map(Map::cast(maybe_map));
|
| + if (constant_elements_kind == FAST_SMI_ONLY_ELEMENTS) {
|
| + object->set_map(Map::cast(global_context->smi_js_array_map()));
|
| + } else if (constant_elements_kind == FAST_DOUBLE_ELEMENTS) {
|
| + object->set_map(Map::cast(global_context->double_js_array_map()));
|
| + } else {
|
| + object->set_map(Map::cast(global_context->object_js_array_map()));
|
| + }
|
|
|
| Handle<FixedArrayBase> copied_elements_values;
|
| - if (IsFastDoubleElementsKind(constant_elements_kind)) {
|
| + if (constant_elements_kind == FAST_DOUBLE_ELEMENTS) {
|
| ASSERT(FLAG_smi_only_arrays);
|
| copied_elements_values = isolate->factory()->CopyFixedDoubleArray(
|
| Handle<FixedDoubleArray>::cast(constant_elements_values));
|
| } else {
|
| - ASSERT(IsFastSmiOrObjectElementsKind(constant_elements_kind));
|
| + ASSERT(constant_elements_kind == FAST_SMI_ONLY_ELEMENTS ||
|
| + constant_elements_kind == FAST_ELEMENTS);
|
| const bool is_cow =
|
| (constant_elements_values->map() ==
|
| isolate->heap()->fixed_cow_array_map());
|
| @@ -524,22 +522,15 @@ Handle<Object> Runtime::CreateArrayLiteralBoilerplate(
|
| object->set_elements(*copied_elements_values);
|
| object->set_length(Smi::FromInt(copied_elements_values->length()));
|
|
|
| - // Ensure that the boilerplate object has FAST_*_ELEMENTS, unless the flag is
|
| + // Ensure that the boilerplate object has FAST_ELEMENTS, unless the flag is
|
| // on or the object is larger than the threshold.
|
| if (!FLAG_smi_only_arrays &&
|
| - constant_elements_values->length() < kSmiLiteralMinimumLength) {
|
| - ElementsKind elements_kind = object->GetElementsKind();
|
| - if (!IsFastObjectElementsKind(elements_kind)) {
|
| - if (IsFastHoleyElementsKind(elements_kind)) {
|
| - CHECK(!TransitionElements(object, FAST_HOLEY_ELEMENTS,
|
| - isolate)->IsFailure());
|
| - } else {
|
| - CHECK(!TransitionElements(object, FAST_ELEMENTS, isolate)->IsFailure());
|
| - }
|
| + constant_elements_values->length() < kSmiOnlyLiteralMinimumLength) {
|
| + if (object->GetElementsKind() != FAST_ELEMENTS) {
|
| + CHECK(!TransitionElements(object, FAST_ELEMENTS, isolate)->IsFailure());
|
| }
|
| }
|
|
|
| - object->ValidateElements();
|
| return object;
|
| }
|
|
|
| @@ -1739,7 +1730,7 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_RegExpExec) {
|
| // length of a string, i.e. it is always a Smi. We check anyway for security.
|
| CONVERT_SMI_ARG_CHECKED(index, 2);
|
| CONVERT_ARG_HANDLE_CHECKED(JSArray, last_match_info, 3);
|
| - RUNTIME_ASSERT(last_match_info->HasFastObjectElements());
|
| + RUNTIME_ASSERT(last_match_info->HasFastElements());
|
| RUNTIME_ASSERT(index >= 0);
|
| RUNTIME_ASSERT(index <= subject->length());
|
| isolate->counters()->regexp_entry_runtime()->Increment();
|
| @@ -3113,7 +3104,7 @@ MUST_USE_RESULT static MaybeObject* StringReplaceRegExpWithString(
|
| const int parts_added_per_loop = 2 * (compiled_replacement.parts() + 2);
|
| bool matched = true;
|
| do {
|
| - ASSERT(last_match_info_handle->HasFastObjectElements());
|
| + ASSERT(last_match_info_handle->HasFastElements());
|
| // Increase the capacity of the builder before entering local handle-scope,
|
| // so its internal buffer can safely allocate a new handle if it grows.
|
| builder.EnsureCapacity(parts_added_per_loop);
|
| @@ -3210,7 +3201,7 @@ MUST_USE_RESULT static MaybeObject* StringReplaceRegExpWithEmptyString(
|
| if (match.is_null()) return Failure::Exception();
|
| if (match->IsNull()) return *subject_handle;
|
|
|
| - ASSERT(last_match_info_handle->HasFastObjectElements());
|
| + ASSERT(last_match_info_handle->HasFastElements());
|
|
|
| int start, end;
|
| {
|
| @@ -3284,7 +3275,7 @@ MUST_USE_RESULT static MaybeObject* StringReplaceRegExpWithEmptyString(
|
| if (match.is_null()) return Failure::Exception();
|
| if (match->IsNull()) break;
|
|
|
| - ASSERT(last_match_info_handle->HasFastObjectElements());
|
| + ASSERT(last_match_info_handle->HasFastElements());
|
| HandleScope loop_scope(isolate);
|
| {
|
| AssertNoAllocation match_info_array_is_not_in_a_handle;
|
| @@ -3354,7 +3345,7 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_StringReplaceRegExpWithString) {
|
| CONVERT_ARG_CHECKED(JSRegExp, regexp, 1);
|
| CONVERT_ARG_CHECKED(JSArray, last_match_info, 3);
|
|
|
| - ASSERT(last_match_info->HasFastObjectElements());
|
| + ASSERT(last_match_info->HasFastElements());
|
|
|
| if (replacement->length() == 0) {
|
| if (subject->HasOnlyAsciiChars()) {
|
| @@ -4037,10 +4028,10 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_RegExpExecMultiple) {
|
| CONVERT_ARG_HANDLE_CHECKED(JSArray, last_match_info, 2);
|
| CONVERT_ARG_HANDLE_CHECKED(JSArray, result_array, 3);
|
|
|
| - ASSERT(last_match_info->HasFastObjectElements());
|
| + ASSERT(last_match_info->HasFastElements());
|
| ASSERT(regexp->GetFlags().is_global());
|
| Handle<FixedArray> result_elements;
|
| - if (result_array->HasFastObjectElements()) {
|
| + if (result_array->HasFastElements()) {
|
| result_elements =
|
| Handle<FixedArray>(FixedArray::cast(result_array->elements()));
|
| }
|
| @@ -4342,22 +4333,17 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_KeyedGetProperty) {
|
| // JSObject without a string key. If the key is a Smi, check for a
|
| // definite out-of-bounds access to elements, which is a strong indicator
|
| // that subsequent accesses will also call the runtime. Proactively
|
| - // transition elements to FAST_*_ELEMENTS to avoid excessive boxing of
|
| + // transition elements to FAST_ELEMENTS to avoid excessive boxing of
|
| // doubles for those future calls in the case that the elements would
|
| // become FAST_DOUBLE_ELEMENTS.
|
| Handle<JSObject> js_object(args.at<JSObject>(0));
|
| ElementsKind elements_kind = js_object->GetElementsKind();
|
| - if (IsFastElementsKind(elements_kind) &&
|
| - !IsFastObjectElementsKind(elements_kind)) {
|
| + if (elements_kind == FAST_SMI_ONLY_ELEMENTS ||
|
| + elements_kind == FAST_DOUBLE_ELEMENTS) {
|
| FixedArrayBase* elements = js_object->elements();
|
| if (args.at<Smi>(1)->value() >= elements->length()) {
|
| - if (IsFastHoleyElementsKind(elements_kind)) {
|
| - elements_kind = FAST_HOLEY_ELEMENTS;
|
| - } else {
|
| - elements_kind = FAST_ELEMENTS;
|
| - }
|
| MaybeObject* maybe_object = TransitionElements(js_object,
|
| - elements_kind,
|
| + FAST_ELEMENTS,
|
| isolate);
|
| if (maybe_object->IsFailure()) return maybe_object;
|
| }
|
| @@ -4527,10 +4513,8 @@ MaybeObject* Runtime::SetObjectProperty(Isolate* isolate,
|
| return *value;
|
| }
|
|
|
| - js_object->ValidateElements();
|
| Handle<Object> result = JSObject::SetElement(
|
| js_object, index, value, attr, strict_mode, set_mode);
|
| - js_object->ValidateElements();
|
| if (result.is_null()) return Failure::Exception();
|
| return *value;
|
| }
|
| @@ -4688,15 +4672,7 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_TransitionElementsSmiToDouble) {
|
| NoHandleAllocation ha;
|
| RUNTIME_ASSERT(args.length() == 1);
|
| Handle<Object> object = args.at<Object>(0);
|
| - if (object->IsJSObject()) {
|
| - Handle<JSObject> js_object(Handle<JSObject>::cast(object));
|
| - ElementsKind new_kind = js_object->HasFastHoleyElements()
|
| - ? FAST_HOLEY_DOUBLE_ELEMENTS
|
| - : FAST_DOUBLE_ELEMENTS;
|
| - return TransitionElements(object, new_kind, isolate);
|
| - } else {
|
| - return *object;
|
| - }
|
| + return TransitionElements(object, FAST_DOUBLE_ELEMENTS, isolate);
|
| }
|
|
|
|
|
| @@ -4704,15 +4680,7 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_TransitionElementsDoubleToObject) {
|
| NoHandleAllocation ha;
|
| RUNTIME_ASSERT(args.length() == 1);
|
| Handle<Object> object = args.at<Object>(0);
|
| - if (object->IsJSObject()) {
|
| - Handle<JSObject> js_object(Handle<JSObject>::cast(object));
|
| - ElementsKind new_kind = js_object->HasFastHoleyElements()
|
| - ? FAST_HOLEY_ELEMENTS
|
| - : FAST_ELEMENTS;
|
| - return TransitionElements(object, new_kind, isolate);
|
| - } else {
|
| - return *object;
|
| - }
|
| + return TransitionElements(object, FAST_ELEMENTS, isolate);
|
| }
|
|
|
|
|
| @@ -4743,38 +4711,32 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_StoreArrayLiteralElement) {
|
| HandleScope scope;
|
|
|
| Object* raw_boilerplate_object = literals->get(literal_index);
|
| - Handle<JSArray> boilerplate_object(JSArray::cast(raw_boilerplate_object));
|
| + Handle<JSArray> boilerplate(JSArray::cast(raw_boilerplate_object));
|
| +#if DEBUG
|
| ElementsKind elements_kind = object->GetElementsKind();
|
| - ASSERT(IsFastElementsKind(elements_kind));
|
| +#endif
|
| + ASSERT(elements_kind <= FAST_DOUBLE_ELEMENTS);
|
| // Smis should never trigger transitions.
|
| ASSERT(!value->IsSmi());
|
|
|
| if (value->IsNumber()) {
|
| - ASSERT(IsFastSmiElementsKind(elements_kind));
|
| - ElementsKind transitioned_kind = IsFastHoleyElementsKind(elements_kind)
|
| - ? FAST_HOLEY_DOUBLE_ELEMENTS
|
| - : FAST_DOUBLE_ELEMENTS;
|
| - if (IsMoreGeneralElementsKindTransition(
|
| - boilerplate_object->GetElementsKind(),
|
| - transitioned_kind)) {
|
| - JSObject::TransitionElementsKind(boilerplate_object, transitioned_kind);
|
| - }
|
| - JSObject::TransitionElementsKind(object, transitioned_kind);
|
| - ASSERT(IsFastDoubleElementsKind(object->GetElementsKind()));
|
| + ASSERT(elements_kind == FAST_SMI_ONLY_ELEMENTS);
|
| + JSObject::TransitionElementsKind(object, FAST_DOUBLE_ELEMENTS);
|
| + if (IsMoreGeneralElementsKindTransition(boilerplate->GetElementsKind(),
|
| + FAST_DOUBLE_ELEMENTS)) {
|
| + JSObject::TransitionElementsKind(boilerplate, FAST_DOUBLE_ELEMENTS);
|
| + }
|
| + ASSERT(object->GetElementsKind() == FAST_DOUBLE_ELEMENTS);
|
| FixedDoubleArray* double_array = FixedDoubleArray::cast(object->elements());
|
| HeapNumber* number = HeapNumber::cast(*value);
|
| double_array->set(store_index, number->Number());
|
| } else {
|
| - ASSERT(IsFastSmiElementsKind(elements_kind) ||
|
| - IsFastDoubleElementsKind(elements_kind));
|
| - ElementsKind transitioned_kind = IsFastHoleyElementsKind(elements_kind)
|
| - ? FAST_HOLEY_ELEMENTS
|
| - : FAST_ELEMENTS;
|
| - JSObject::TransitionElementsKind(object, transitioned_kind);
|
| - if (IsMoreGeneralElementsKindTransition(
|
| - boilerplate_object->GetElementsKind(),
|
| - transitioned_kind)) {
|
| - JSObject::TransitionElementsKind(boilerplate_object, transitioned_kind);
|
| + ASSERT(elements_kind == FAST_SMI_ONLY_ELEMENTS ||
|
| + elements_kind == FAST_DOUBLE_ELEMENTS);
|
| + JSObject::TransitionElementsKind(object, FAST_ELEMENTS);
|
| + if (IsMoreGeneralElementsKindTransition(boilerplate->GetElementsKind(),
|
| + FAST_ELEMENTS)) {
|
| + JSObject::TransitionElementsKind(boilerplate, FAST_ELEMENTS);
|
| }
|
| FixedArray* object_array = FixedArray::cast(object->elements());
|
| object_array->set(store_index, *value);
|
| @@ -5987,9 +5949,7 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_QuoteJSONStringArray) {
|
| ASSERT(args.length() == 1);
|
| CONVERT_ARG_CHECKED(JSArray, array, 0);
|
|
|
| - if (!array->HasFastObjectElements()) {
|
| - return isolate->heap()->undefined_value();
|
| - }
|
| + if (!array->HasFastElements()) return isolate->heap()->undefined_value();
|
| FixedArray* elements = FixedArray::cast(array->elements());
|
| int n = elements->length();
|
| bool ascii = true;
|
| @@ -6432,7 +6392,7 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_StringSplit) {
|
| if (maybe_result->IsFailure()) return maybe_result;
|
| result->set_length(Smi::FromInt(part_count));
|
|
|
| - ASSERT(result->HasFastObjectElements());
|
| + ASSERT(result->HasFastElements());
|
|
|
| if (part_count == 1 && indices.at(0) == subject_length) {
|
| FixedArray::cast(result->elements())->set(0, *subject);
|
| @@ -6451,7 +6411,7 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_StringSplit) {
|
| }
|
|
|
| if (limit == 0xffffffffu) {
|
| - if (result->HasFastObjectElements()) {
|
| + if (result->HasFastElements()) {
|
| StringSplitCache::Enter(isolate->heap(),
|
| isolate->heap()->string_split_cache(),
|
| *subject,
|
| @@ -6808,7 +6768,7 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_StringBuilderConcat) {
|
| if (maybe_result->IsFailure()) return maybe_result;
|
|
|
| int special_length = special->length();
|
| - if (!array->HasFastObjectElements()) {
|
| + if (!array->HasFastElements()) {
|
| return isolate->Throw(isolate->heap()->illegal_argument_symbol());
|
| }
|
| FixedArray* fixed_array = FixedArray::cast(array->elements());
|
| @@ -6918,7 +6878,7 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_StringBuilderJoin) {
|
| int array_length = args.smi_at(1);
|
| CONVERT_ARG_CHECKED(String, separator, 2);
|
|
|
| - if (!array->HasFastObjectElements()) {
|
| + if (!array->HasFastElements()) {
|
| return isolate->Throw(isolate->heap()->illegal_argument_symbol());
|
| }
|
| FixedArray* fixed_array = FixedArray::cast(array->elements());
|
| @@ -7035,7 +6995,8 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_SparseJoinWithSeparator) {
|
| NoHandleAllocation ha;
|
| ASSERT(args.length() == 3);
|
| CONVERT_ARG_CHECKED(JSArray, elements_array, 0);
|
| - RUNTIME_ASSERT(elements_array->HasFastSmiOrObjectElements());
|
| + RUNTIME_ASSERT(elements_array->HasFastElements() ||
|
| + elements_array->HasFastSmiOnlyElements());
|
| CONVERT_NUMBER_CHECKED(uint32_t, array_length, Uint32, args[1]);
|
| CONVERT_ARG_CHECKED(String, separator, 2);
|
| // elements_array is fast-mode JSarray of alternating positions
|
| @@ -9196,7 +9157,7 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_DateParseString) {
|
| MaybeObject* maybe_result_array =
|
| output->EnsureCanContainHeapObjectElements();
|
| if (maybe_result_array->IsFailure()) return maybe_result_array;
|
| - RUNTIME_ASSERT(output->HasFastObjectElements());
|
| + RUNTIME_ASSERT(output->HasFastElements());
|
|
|
| AssertNoAllocation no_allocation;
|
|
|
| @@ -9428,7 +9389,7 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_PushIfAbsent) {
|
| ASSERT(args.length() == 2);
|
| CONVERT_ARG_CHECKED(JSArray, array, 0);
|
| CONVERT_ARG_CHECKED(JSObject, element, 1);
|
| - RUNTIME_ASSERT(array->HasFastSmiOrObjectElements());
|
| + RUNTIME_ASSERT(array->HasFastElements() || array->HasFastSmiOnlyElements());
|
| int length = Smi::cast(array->length())->value();
|
| FixedArray* elements = FixedArray::cast(array->elements());
|
| for (int i = 0; i < length; i++) {
|
| @@ -9513,7 +9474,7 @@ class ArrayConcatVisitor {
|
| Handle<Map> map;
|
| if (fast_elements_) {
|
| map = isolate_->factory()->GetElementsTransitionMap(array,
|
| - FAST_HOLEY_ELEMENTS);
|
| + FAST_ELEMENTS);
|
| } else {
|
| map = isolate_->factory()->GetElementsTransitionMap(array,
|
| DICTIONARY_ELEMENTS);
|
| @@ -9572,10 +9533,8 @@ static uint32_t EstimateElementCount(Handle<JSArray> array) {
|
| uint32_t length = static_cast<uint32_t>(array->length()->Number());
|
| int element_count = 0;
|
| switch (array->GetElementsKind()) {
|
| - case FAST_SMI_ELEMENTS:
|
| - case FAST_HOLEY_SMI_ELEMENTS:
|
| - case FAST_ELEMENTS:
|
| - case FAST_HOLEY_ELEMENTS: {
|
| + case FAST_SMI_ONLY_ELEMENTS:
|
| + case FAST_ELEMENTS: {
|
| // Fast elements can't have lengths that are not representable by
|
| // a 32-bit signed integer.
|
| ASSERT(static_cast<int32_t>(FixedArray::kMaxLength) >= 0);
|
| @@ -9587,7 +9546,6 @@ static uint32_t EstimateElementCount(Handle<JSArray> array) {
|
| break;
|
| }
|
| case FAST_DOUBLE_ELEMENTS:
|
| - case FAST_HOLEY_DOUBLE_ELEMENTS:
|
| // TODO(1810): Decide if it's worthwhile to implement this.
|
| UNREACHABLE();
|
| break;
|
| @@ -9678,10 +9636,8 @@ static void CollectElementIndices(Handle<JSObject> object,
|
| List<uint32_t>* indices) {
|
| ElementsKind kind = object->GetElementsKind();
|
| switch (kind) {
|
| - case FAST_SMI_ELEMENTS:
|
| - case FAST_ELEMENTS:
|
| - case FAST_HOLEY_SMI_ELEMENTS:
|
| - case FAST_HOLEY_ELEMENTS: {
|
| + case FAST_SMI_ONLY_ELEMENTS:
|
| + case FAST_ELEMENTS: {
|
| Handle<FixedArray> elements(FixedArray::cast(object->elements()));
|
| uint32_t length = static_cast<uint32_t>(elements->length());
|
| if (range < length) length = range;
|
| @@ -9692,7 +9648,6 @@ static void CollectElementIndices(Handle<JSObject> object,
|
| }
|
| break;
|
| }
|
| - case FAST_HOLEY_DOUBLE_ELEMENTS:
|
| case FAST_DOUBLE_ELEMENTS: {
|
| // TODO(1810): Decide if it's worthwhile to implement this.
|
| UNREACHABLE();
|
| @@ -9807,10 +9762,8 @@ static bool IterateElements(Isolate* isolate,
|
| ArrayConcatVisitor* visitor) {
|
| uint32_t length = static_cast<uint32_t>(receiver->length()->Number());
|
| switch (receiver->GetElementsKind()) {
|
| - case FAST_SMI_ELEMENTS:
|
| - case FAST_ELEMENTS:
|
| - case FAST_HOLEY_SMI_ELEMENTS:
|
| - case FAST_HOLEY_ELEMENTS: {
|
| + case FAST_SMI_ONLY_ELEMENTS:
|
| + case FAST_ELEMENTS: {
|
| // Run through the elements FixedArray and use HasElement and GetElement
|
| // to check the prototype for missing elements.
|
| Handle<FixedArray> elements(FixedArray::cast(receiver->elements()));
|
| @@ -9831,7 +9784,6 @@ static bool IterateElements(Isolate* isolate,
|
| }
|
| break;
|
| }
|
| - case FAST_HOLEY_DOUBLE_ELEMENTS:
|
| case FAST_DOUBLE_ELEMENTS: {
|
| // TODO(1810): Decide if it's worthwhile to implement this.
|
| UNREACHABLE();
|
| @@ -9929,7 +9881,7 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_ArrayConcat) {
|
|
|
| CONVERT_ARG_HANDLE_CHECKED(JSArray, arguments, 0);
|
| int argument_count = static_cast<int>(arguments->length()->Number());
|
| - RUNTIME_ASSERT(arguments->HasFastObjectElements());
|
| + RUNTIME_ASSERT(arguments->HasFastElements());
|
| Handle<FixedArray> elements(FixedArray::cast(arguments->elements()));
|
|
|
| // Pass 1: estimate the length and number of elements of the result.
|
| @@ -9949,14 +9901,10 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_ArrayConcat) {
|
| Handle<JSArray> array(Handle<JSArray>::cast(obj));
|
| // TODO(1810): Find out if it's worthwhile to properly support
|
| // arbitrary ElementsKinds. For now, pessimistically transition to
|
| - // FAST_*_ELEMENTS.
|
| + // FAST_ELEMENTS.
|
| if (array->HasFastDoubleElements()) {
|
| - ElementsKind to_kind = FAST_ELEMENTS;
|
| - if (array->HasFastHoleyElements()) {
|
| - to_kind = FAST_HOLEY_ELEMENTS;
|
| - }
|
| array = Handle<JSArray>::cast(
|
| - JSObject::TransitionElementsKind(array, to_kind));
|
| + JSObject::TransitionElementsKind(array, FAST_ELEMENTS));
|
| }
|
| length_estimate =
|
| static_cast<uint32_t>(array->length()->Number());
|
| @@ -10053,22 +10001,29 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_MoveArrayContents) {
|
| ASSERT(args.length() == 2);
|
| CONVERT_ARG_CHECKED(JSArray, from, 0);
|
| CONVERT_ARG_CHECKED(JSArray, to, 1);
|
| - from->ValidateElements();
|
| - to->ValidateElements();
|
| FixedArrayBase* new_elements = from->elements();
|
| - ElementsKind from_kind = from->GetElementsKind();
|
| MaybeObject* maybe_new_map;
|
| - maybe_new_map = to->GetElementsTransitionMap(isolate, from_kind);
|
| + ElementsKind elements_kind;
|
| + if (new_elements->map() == isolate->heap()->fixed_array_map() ||
|
| + new_elements->map() == isolate->heap()->fixed_cow_array_map()) {
|
| + elements_kind = FAST_ELEMENTS;
|
| + } else if (new_elements->map() ==
|
| + isolate->heap()->fixed_double_array_map()) {
|
| + elements_kind = FAST_DOUBLE_ELEMENTS;
|
| + } else {
|
| + elements_kind = DICTIONARY_ELEMENTS;
|
| + }
|
| + maybe_new_map = to->GetElementsTransitionMap(isolate, elements_kind);
|
| Object* new_map;
|
| if (!maybe_new_map->ToObject(&new_map)) return maybe_new_map;
|
| - to->set_map_and_elements(Map::cast(new_map), new_elements);
|
| + to->set_map(Map::cast(new_map));
|
| + to->set_elements(new_elements);
|
| to->set_length(from->length());
|
| Object* obj;
|
| { MaybeObject* maybe_obj = from->ResetElements();
|
| if (!maybe_obj->ToObject(&obj)) return maybe_obj;
|
| }
|
| from->set_length(Smi::FromInt(0));
|
| - to->ValidateElements();
|
| return to;
|
| }
|
|
|
| @@ -10118,7 +10073,8 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_GetArrayKeys) {
|
| }
|
| return *isolate->factory()->NewJSArrayWithElements(keys);
|
| } else {
|
| - ASSERT(array->HasFastSmiOrObjectElements() ||
|
| + ASSERT(array->HasFastElements() ||
|
| + array->HasFastSmiOnlyElements() ||
|
| array->HasFastDoubleElements());
|
| Handle<FixedArray> single_interval = isolate->factory()->NewFixedArray(2);
|
| // -1 means start of array.
|
| @@ -13433,11 +13389,9 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_IS_VAR) {
|
| return isolate->heap()->ToBoolean(obj->Has##Name()); \
|
| }
|
|
|
| -ELEMENTS_KIND_CHECK_RUNTIME_FUNCTION(FastSmiElements)
|
| -ELEMENTS_KIND_CHECK_RUNTIME_FUNCTION(FastObjectElements)
|
| -ELEMENTS_KIND_CHECK_RUNTIME_FUNCTION(FastSmiOrObjectElements)
|
| +ELEMENTS_KIND_CHECK_RUNTIME_FUNCTION(FastSmiOnlyElements)
|
| +ELEMENTS_KIND_CHECK_RUNTIME_FUNCTION(FastElements)
|
| ELEMENTS_KIND_CHECK_RUNTIME_FUNCTION(FastDoubleElements)
|
| -ELEMENTS_KIND_CHECK_RUNTIME_FUNCTION(FastHoleyElements)
|
| ELEMENTS_KIND_CHECK_RUNTIME_FUNCTION(DictionaryElements)
|
| ELEMENTS_KIND_CHECK_RUNTIME_FUNCTION(ExternalPixelElements)
|
| ELEMENTS_KIND_CHECK_RUNTIME_FUNCTION(ExternalArrayElements)
|
|
|