| 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;
 | 
|    }
 | 
| 
 |