| Index: src/builtins.cc
|
| diff --git a/src/builtins.cc b/src/builtins.cc
|
| index 64ec3d9fcc485f9d8fe9c7856072c4f5c4cea84b..84a0c3d19caa095907d5076bf54a3a99876464df 100644
|
| --- a/src/builtins.cc
|
| +++ b/src/builtins.cc
|
| @@ -200,12 +200,9 @@ static MaybeObject* ArrayCodeGenericCommon(Arguments* args,
|
| array->set_elements(heap->empty_fixed_array());
|
| if (!FLAG_smi_only_arrays) {
|
| Context* global_context = isolate->context()->global_context();
|
| - if (array->GetElementsKind() == GetInitialFastElementsKind() &&
|
| - !global_context->js_array_maps()->IsUndefined()) {
|
| - FixedArray* map_array =
|
| - FixedArray::cast(global_context->js_array_maps());
|
| - array->set_map(Map::cast(map_array->
|
| - get(TERMINAL_FAST_ELEMENTS_KIND)));
|
| + if (array->GetElementsKind() == FAST_SMI_ONLY_ELEMENTS &&
|
| + !global_context->object_js_array_map()->IsUndefined()) {
|
| + array->set_map(Map::cast(global_context->object_js_array_map()));
|
| }
|
| }
|
| } else {
|
| @@ -225,13 +222,6 @@ static MaybeObject* ArrayCodeGenericCommon(Arguments* args,
|
| { MaybeObject* maybe_obj = heap->AllocateFixedArrayWithHoles(len);
|
| if (!maybe_obj->ToObject(&fixed_array)) return maybe_obj;
|
| }
|
| - ElementsKind elements_kind = array->GetElementsKind();
|
| - if (!IsFastHoleyElementsKind(elements_kind)) {
|
| - elements_kind = GetHoleyElementsKind(elements_kind);
|
| - MaybeObject* maybe_array =
|
| - array->TransitionElementsKind(elements_kind);
|
| - if (maybe_array->IsFailure()) return maybe_array;
|
| - }
|
| // We do not use SetContent to skip the unnecessary elements type check.
|
| array->set_elements(FixedArray::cast(fixed_array));
|
| array->set_length(Smi::cast(obj));
|
| @@ -260,7 +250,7 @@ static MaybeObject* ArrayCodeGenericCommon(Arguments* args,
|
| // Allocate an appropriately typed elements array.
|
| MaybeObject* maybe_elms;
|
| ElementsKind elements_kind = array->GetElementsKind();
|
| - if (IsFastDoubleElementsKind(elements_kind)) {
|
| + if (elements_kind == FAST_DOUBLE_ELEMENTS) {
|
| maybe_elms = heap->AllocateUninitializedFixedDoubleArray(
|
| number_of_elements);
|
| } else {
|
| @@ -271,15 +261,13 @@ static MaybeObject* ArrayCodeGenericCommon(Arguments* args,
|
|
|
| // Fill in the content
|
| switch (array->GetElementsKind()) {
|
| - case FAST_HOLEY_SMI_ELEMENTS:
|
| - case FAST_SMI_ELEMENTS: {
|
| + case FAST_SMI_ONLY_ELEMENTS: {
|
| FixedArray* smi_elms = FixedArray::cast(elms);
|
| for (int index = 0; index < number_of_elements; index++) {
|
| smi_elms->set(index, (*args)[index+1], SKIP_WRITE_BARRIER);
|
| }
|
| break;
|
| }
|
| - case FAST_HOLEY_ELEMENTS:
|
| case FAST_ELEMENTS: {
|
| AssertNoAllocation no_gc;
|
| WriteBarrierMode mode = elms->GetWriteBarrierMode(no_gc);
|
| @@ -289,7 +277,6 @@ static MaybeObject* ArrayCodeGenericCommon(Arguments* args,
|
| }
|
| break;
|
| }
|
| - case FAST_HOLEY_DOUBLE_ELEMENTS:
|
| case FAST_DOUBLE_ELEMENTS: {
|
| FixedDoubleArray* double_elms = FixedDoubleArray::cast(elms);
|
| for (int index = 0; index < number_of_elements; index++) {
|
| @@ -425,7 +412,7 @@ static inline MaybeObject* EnsureJSArrayWithWritableFastElements(
|
| HeapObject* elms = array->elements();
|
| Map* map = elms->map();
|
| if (map == heap->fixed_array_map()) {
|
| - if (args == NULL || array->HasFastObjectElements()) return elms;
|
| + if (args == NULL || array->HasFastElements()) return elms;
|
| if (array->HasFastDoubleElements()) {
|
| ASSERT(elms == heap->empty_fixed_array());
|
| MaybeObject* maybe_transition =
|
| @@ -435,7 +422,7 @@ static inline MaybeObject* EnsureJSArrayWithWritableFastElements(
|
| }
|
| } else if (map == heap->fixed_cow_array_map()) {
|
| MaybeObject* maybe_writable_result = array->EnsureWritableFastElements();
|
| - if (args == NULL || array->HasFastObjectElements() ||
|
| + if (args == NULL || array->HasFastElements() ||
|
| maybe_writable_result->IsFailure()) {
|
| return maybe_writable_result;
|
| }
|
| @@ -529,8 +516,8 @@ BUILTIN(ArrayPush) {
|
| }
|
| FixedArray* new_elms = FixedArray::cast(obj);
|
|
|
| - ElementsKind kind = array->GetElementsKind();
|
| - CopyObjectToObjectElements(elms, kind, 0, new_elms, kind, 0, len);
|
| + CopyObjectToObjectElements(elms, FAST_ELEMENTS, 0,
|
| + new_elms, FAST_ELEMENTS, 0, len);
|
| FillWithHoles(heap, new_elms, new_length, capacity);
|
|
|
| elms = new_elms;
|
| @@ -601,7 +588,7 @@ BUILTIN(ArrayShift) {
|
| }
|
| FixedArray* elms = FixedArray::cast(elms_obj);
|
| JSArray* array = JSArray::cast(receiver);
|
| - ASSERT(array->HasFastSmiOrObjectElements());
|
| + ASSERT(array->HasFastTypeElements());
|
|
|
| int len = Smi::cast(array->length())->value();
|
| if (len == 0) return heap->undefined_value();
|
| @@ -643,7 +630,7 @@ BUILTIN(ArrayUnshift) {
|
| }
|
| FixedArray* elms = FixedArray::cast(elms_obj);
|
| JSArray* array = JSArray::cast(receiver);
|
| - ASSERT(array->HasFastSmiOrObjectElements());
|
| + ASSERT(array->HasFastTypeElements());
|
|
|
| int len = Smi::cast(array->length())->value();
|
| int to_add = args.length() - 1;
|
| @@ -665,8 +652,8 @@ BUILTIN(ArrayUnshift) {
|
| if (!maybe_obj->ToObject(&obj)) return maybe_obj;
|
| }
|
| FixedArray* new_elms = FixedArray::cast(obj);
|
| - ElementsKind kind = array->GetElementsKind();
|
| - CopyObjectToObjectElements(elms, kind, 0, new_elms, kind, to_add, len);
|
| + CopyObjectToObjectElements(elms, FAST_ELEMENTS, 0,
|
| + new_elms, FAST_ELEMENTS, to_add, len);
|
| FillWithHoles(heap, new_elms, new_length, capacity);
|
| elms = new_elms;
|
| array->set_elements(elms);
|
| @@ -695,7 +682,7 @@ BUILTIN(ArraySlice) {
|
| int len = -1;
|
| if (receiver->IsJSArray()) {
|
| JSArray* array = JSArray::cast(receiver);
|
| - if (!array->HasFastSmiOrObjectElements() ||
|
| + if (!array->HasFastTypeElements() ||
|
| !IsJSArrayFastElementMovingAllowed(heap, array)) {
|
| return CallJsBuiltin(isolate, "ArraySlice", args);
|
| }
|
| @@ -711,7 +698,7 @@ BUILTIN(ArraySlice) {
|
| bool is_arguments_object_with_fast_elements =
|
| receiver->IsJSObject()
|
| && JSObject::cast(receiver)->map() == arguments_map
|
| - && JSObject::cast(receiver)->HasFastSmiOrObjectElements();
|
| + && JSObject::cast(receiver)->HasFastTypeElements();
|
| if (!is_arguments_object_with_fast_elements) {
|
| return CallJsBuiltin(isolate, "ArraySlice", args);
|
| }
|
| @@ -776,9 +763,9 @@ BUILTIN(ArraySlice) {
|
| JSArray* result_array;
|
| if (!maybe_array->To(&result_array)) return maybe_array;
|
|
|
| - CopyObjectToObjectElements(elms, elements_kind, k,
|
| + CopyObjectToObjectElements(elms, FAST_ELEMENTS, k,
|
| FixedArray::cast(result_array->elements()),
|
| - elements_kind, 0, result_len);
|
| + FAST_ELEMENTS, 0, result_len);
|
|
|
| return result_array;
|
| }
|
| @@ -799,7 +786,7 @@ BUILTIN(ArraySplice) {
|
| }
|
| FixedArray* elms = FixedArray::cast(elms_obj);
|
| JSArray* array = JSArray::cast(receiver);
|
| - ASSERT(array->HasFastSmiOrObjectElements());
|
| + ASSERT(array->HasFastTypeElements());
|
|
|
| int len = Smi::cast(array->length())->value();
|
|
|
| @@ -850,9 +837,9 @@ BUILTIN(ArraySplice) {
|
|
|
| {
|
| // Fill newly created array.
|
| - CopyObjectToObjectElements(elms, elements_kind, actual_start,
|
| + CopyObjectToObjectElements(elms, FAST_ELEMENTS, actual_start,
|
| FixedArray::cast(result_array->elements()),
|
| - elements_kind, 0, actual_delete_count);
|
| + FAST_ELEMENTS, 0, actual_delete_count);
|
| }
|
|
|
| int item_count = (n_arguments > 1) ? (n_arguments - 2) : 0;
|
| @@ -901,13 +888,12 @@ BUILTIN(ArraySplice) {
|
|
|
| {
|
| // Copy the part before actual_start as is.
|
| - ElementsKind kind = array->GetElementsKind();
|
| - CopyObjectToObjectElements(elms, kind, 0,
|
| - new_elms, kind, 0, actual_start);
|
| + CopyObjectToObjectElements(elms, FAST_ELEMENTS, 0,
|
| + new_elms, FAST_ELEMENTS, 0, actual_start);
|
| const int to_copy = len - actual_delete_count - actual_start;
|
| - CopyObjectToObjectElements(elms, kind,
|
| + CopyObjectToObjectElements(elms, FAST_ELEMENTS,
|
| actual_start + actual_delete_count,
|
| - new_elms, kind,
|
| + new_elms, FAST_ELEMENTS,
|
| actual_start + item_count, to_copy);
|
| }
|
|
|
| @@ -954,12 +940,11 @@ BUILTIN(ArrayConcat) {
|
| // and calculating total length.
|
| int n_arguments = args.length();
|
| int result_len = 0;
|
| - ElementsKind elements_kind = GetInitialFastElementsKind();
|
| + ElementsKind elements_kind = FAST_SMI_ONLY_ELEMENTS;
|
| for (int i = 0; i < n_arguments; i++) {
|
| Object* arg = args[i];
|
| - if (!arg->IsJSArray() ||
|
| - !JSArray::cast(arg)->HasFastSmiOrObjectElements() ||
|
| - JSArray::cast(arg)->GetPrototype() != array_proto) {
|
| + if (!arg->IsJSArray() || !JSArray::cast(arg)->HasFastTypeElements()
|
| + || JSArray::cast(arg)->GetPrototype() != array_proto) {
|
| return CallJsBuiltin(isolate, "ArrayConcat", args);
|
| }
|
|
|
| @@ -976,18 +961,8 @@ BUILTIN(ArrayConcat) {
|
| return CallJsBuiltin(isolate, "ArrayConcat", args);
|
| }
|
|
|
| - if (!JSArray::cast(arg)->HasFastSmiElements()) {
|
| - if (IsFastSmiElementsKind(elements_kind)) {
|
| - if (IsFastHoleyElementsKind(elements_kind)) {
|
| - elements_kind = FAST_HOLEY_ELEMENTS;
|
| - } else {
|
| - elements_kind = FAST_ELEMENTS;
|
| - }
|
| - }
|
| - }
|
| -
|
| - if (JSArray::cast(arg)->HasFastHoleyElements()) {
|
| - elements_kind = GetHoleyElementsKind(elements_kind);
|
| + if (!JSArray::cast(arg)->HasFastSmiOnlyElements()) {
|
| + elements_kind = FAST_ELEMENTS;
|
| }
|
| }
|
|
|
| @@ -1007,8 +982,8 @@ BUILTIN(ArrayConcat) {
|
| JSArray* array = JSArray::cast(args[i]);
|
| int len = Smi::cast(array->length())->value();
|
| FixedArray* elms = FixedArray::cast(array->elements());
|
| - CopyObjectToObjectElements(elms, elements_kind, 0,
|
| - result_elms, elements_kind,
|
| + CopyObjectToObjectElements(elms, FAST_ELEMENTS, 0,
|
| + result_elms, FAST_ELEMENTS,
|
| start_pos, len);
|
| start_pos += len;
|
| }
|
|
|