Index: src/arm/stub-cache-arm.cc |
diff --git a/src/arm/stub-cache-arm.cc b/src/arm/stub-cache-arm.cc |
index 49c09823015668fbd68e86001294db807ba8b227..a024d798003cdf1625d42482cda3b7916601e9d2 100644 |
--- a/src/arm/stub-cache-arm.cc |
+++ b/src/arm/stub-cache-arm.cc |
@@ -1581,16 +1581,29 @@ Handle<Code> CallStubCompiler::CompileArrayPushCall( |
__ jmp(&fast_object); |
// In case of fast smi-only, convert to fast object, otherwise bail out. |
__ bind(¬_fast_object); |
- __ CheckFastSmiOnlyElements(r3, r7, &call_builtin); |
+ __ CheckFastSmiElements(r3, r7, &call_builtin); |
// edx: receiver |
// r3: map |
- __ LoadTransitionedArrayMapConditional(FAST_SMI_ONLY_ELEMENTS, |
+ Label try_holey_map; |
+ __ LoadTransitionedArrayMapConditional(FAST_SMI_ELEMENTS, |
FAST_ELEMENTS, |
r3, |
r7, |
+ &try_holey_map); |
+ __ mov(r2, receiver); |
+ ElementsTransitionGenerator:: |
+ GenerateMapChangeElementsTransition(masm()); |
+ __ jmp(&fast_object); |
+ |
+ __ bind(&try_holey_map); |
+ __ LoadTransitionedArrayMapConditional(FAST_HOLEY_SMI_ELEMENTS, |
+ FAST_HOLEY_ELEMENTS, |
+ r3, |
+ r7, |
&call_builtin); |
__ mov(r2, receiver); |
- ElementsTransitionGenerator::GenerateSmiOnlyToObject(masm()); |
+ ElementsTransitionGenerator:: |
+ GenerateMapChangeElementsTransition(masm()); |
__ bind(&fast_object); |
} else { |
__ CheckFastObjectElements(r3, r3, &call_builtin); |
@@ -3372,8 +3385,11 @@ static bool IsElementTypeSigned(ElementsKind elements_kind) { |
case EXTERNAL_FLOAT_ELEMENTS: |
case EXTERNAL_DOUBLE_ELEMENTS: |
case FAST_ELEMENTS: |
- case FAST_SMI_ONLY_ELEMENTS: |
+ case FAST_SMI_ELEMENTS: |
case FAST_DOUBLE_ELEMENTS: |
+ case FAST_HOLEY_ELEMENTS: |
+ case FAST_HOLEY_SMI_ELEMENTS: |
+ case FAST_HOLEY_DOUBLE_ELEMENTS: |
case DICTIONARY_ELEMENTS: |
case NON_STRICT_ARGUMENTS_ELEMENTS: |
UNREACHABLE(); |
@@ -3497,8 +3513,11 @@ void KeyedLoadStubCompiler::GenerateLoadExternalArray( |
} |
break; |
case FAST_ELEMENTS: |
- case FAST_SMI_ONLY_ELEMENTS: |
+ case FAST_SMI_ELEMENTS: |
case FAST_DOUBLE_ELEMENTS: |
+ case FAST_HOLEY_ELEMENTS: |
+ case FAST_HOLEY_SMI_ELEMENTS: |
+ case FAST_HOLEY_DOUBLE_ELEMENTS: |
case DICTIONARY_ELEMENTS: |
case NON_STRICT_ARGUMENTS_ELEMENTS: |
UNREACHABLE(); |
@@ -3838,8 +3857,11 @@ void KeyedStoreStubCompiler::GenerateStoreExternalArray( |
} |
break; |
case FAST_ELEMENTS: |
- case FAST_SMI_ONLY_ELEMENTS: |
+ case FAST_SMI_ELEMENTS: |
case FAST_DOUBLE_ELEMENTS: |
+ case FAST_HOLEY_ELEMENTS: |
+ case FAST_HOLEY_SMI_ELEMENTS: |
+ case FAST_HOLEY_DOUBLE_ELEMENTS: |
case DICTIONARY_ELEMENTS: |
case NON_STRICT_ARGUMENTS_ELEMENTS: |
UNREACHABLE(); |
@@ -3902,8 +3924,11 @@ void KeyedStoreStubCompiler::GenerateStoreExternalArray( |
case EXTERNAL_FLOAT_ELEMENTS: |
case EXTERNAL_DOUBLE_ELEMENTS: |
case FAST_ELEMENTS: |
- case FAST_SMI_ONLY_ELEMENTS: |
+ case FAST_SMI_ELEMENTS: |
case FAST_DOUBLE_ELEMENTS: |
+ case FAST_HOLEY_ELEMENTS: |
+ case FAST_HOLEY_SMI_ELEMENTS: |
+ case FAST_HOLEY_DOUBLE_ELEMENTS: |
case DICTIONARY_ELEMENTS: |
case NON_STRICT_ARGUMENTS_ELEMENTS: |
UNREACHABLE(); |
@@ -4042,8 +4067,11 @@ void KeyedStoreStubCompiler::GenerateStoreExternalArray( |
case EXTERNAL_FLOAT_ELEMENTS: |
case EXTERNAL_DOUBLE_ELEMENTS: |
case FAST_ELEMENTS: |
- case FAST_SMI_ONLY_ELEMENTS: |
+ case FAST_SMI_ELEMENTS: |
case FAST_DOUBLE_ELEMENTS: |
+ case FAST_HOLEY_ELEMENTS: |
+ case FAST_HOLEY_SMI_ELEMENTS: |
+ case FAST_HOLEY_DOUBLE_ELEMENTS: |
case DICTIONARY_ELEMENTS: |
case NON_STRICT_ARGUMENTS_ELEMENTS: |
UNREACHABLE(); |
@@ -4225,7 +4253,7 @@ void KeyedStoreStubCompiler::GenerateStoreFastElement( |
// Check that the key is a smi or a heap number convertible to a smi. |
GenerateSmiKeyCheck(masm, key_reg, r4, r5, d1, &miss_force_generic); |
- if (elements_kind == FAST_SMI_ONLY_ELEMENTS) { |
+ if (IsFastSmiElementsKind(elements_kind)) { |
__ JumpIfNotSmi(value_reg, &transition_elements_kind); |
} |
@@ -4253,7 +4281,7 @@ void KeyedStoreStubCompiler::GenerateStoreFastElement( |
DONT_DO_SMI_CHECK); |
__ bind(&finish_store); |
- if (elements_kind == FAST_SMI_ONLY_ELEMENTS) { |
+ if (IsFastSmiElementsKind(elements_kind)) { |
__ add(scratch, |
elements_reg, |
Operand(FixedArray::kHeaderSize - kHeapObjectTag)); |
@@ -4263,7 +4291,7 @@ void KeyedStoreStubCompiler::GenerateStoreFastElement( |
Operand(key_reg, LSL, kPointerSizeLog2 - kSmiTagSize)); |
__ str(value_reg, MemOperand(scratch)); |
} else { |
- ASSERT(elements_kind == FAST_ELEMENTS); |
+ ASSERT(IsFastObjectElementsKind(elements_kind)); |
__ add(scratch, |
elements_reg, |
Operand(FixedArray::kHeaderSize - kHeapObjectTag)); |