| Index: src/arm/macro-assembler-arm.cc | 
| diff --git a/src/arm/macro-assembler-arm.cc b/src/arm/macro-assembler-arm.cc | 
| index 933399e00f43bd62c65993cb1b820d0035aa2cc7..cac8ffb5129d8be2c3de037e88d6f28dfaa124b6 100644 | 
| --- a/src/arm/macro-assembler-arm.cc | 
| +++ b/src/arm/macro-assembler-arm.cc | 
| @@ -3014,6 +3014,20 @@ void MacroAssembler::AbortIfNotSmi(Register object) { | 
| } | 
|  | 
|  | 
| +void MacroAssembler::AbortIfNotFixedArray(Register object, Register scratch) { | 
| +  Label ok, fail; | 
| +  CheckMap(object, | 
| +           scratch, | 
| +           isolate()->factory()->fixed_array_map(), | 
| +           &fail, | 
| +           DONT_DO_SMI_CHECK); | 
| +  jmp(&ok); | 
| +  bind(&fail); | 
| +  Abort("Operand is not a fixed array"); | 
| +  bind(&ok); | 
| +} | 
| + | 
| + | 
| void MacroAssembler::AbortIfNotString(Register object) { | 
| STATIC_ASSERT(kSmiTag == 0); | 
| tst(object, Operand(kSmiTagMask)); | 
| @@ -3673,13 +3687,25 @@ void MacroAssembler::ClampDoubleToUint8(Register result_reg, | 
|  | 
|  | 
| void MacroAssembler::LoadInstanceDescriptors(Register map, | 
| -                                             Register descriptors) { | 
| +                                             Register descriptors, | 
| +                                             Register scratch) { | 
| ldr(descriptors, | 
| -      FieldMemOperand(map, Map::kInstanceDescriptorsOrBitField3Offset)); | 
| -  Label not_smi; | 
| -  JumpIfNotSmi(descriptors, ¬_smi); | 
| +      FieldMemOperand(map, Map::kInstanceDescriptorsOrBackPointerOffset)); | 
| + | 
| +  Label ok, fail; | 
| +  CheckMap(descriptors, | 
| +           scratch, | 
| +           isolate()->factory()->fixed_array_map(), | 
| +           &fail, | 
| +           DONT_DO_SMI_CHECK); | 
| +  jmp(&ok); | 
| +  bind(&fail); | 
| mov(descriptors, Operand(FACTORY->empty_descriptor_array())); | 
| -  bind(¬_smi); | 
| +  bind(&ok); | 
| + | 
| +  if (emit_debug_code()) { | 
| +    AbortIfNotFixedArray(descriptors, scratch); | 
| +  } | 
| } | 
|  | 
|  | 
| @@ -3704,8 +3730,17 @@ void MacroAssembler::CheckEnumCache(Register null_value, Label* call_runtime) { | 
| // check for an enum cache.  Leave the map in r2 for the subsequent | 
| // prototype load. | 
| ldr(r2, FieldMemOperand(r1, HeapObject::kMapOffset)); | 
| -  ldr(r3, FieldMemOperand(r2, Map::kInstanceDescriptorsOrBitField3Offset)); | 
| -  JumpIfSmi(r3, call_runtime); | 
| +  ldr(r3, FieldMemOperand(r2, Map::kInstanceDescriptorsOrBackPointerOffset)); | 
| + | 
| +  CheckMap(r3, | 
| +           r7, | 
| +           isolate()->factory()->fixed_array_map(), | 
| +           call_runtime, | 
| +           DONT_DO_SMI_CHECK); | 
| + | 
| +  if (emit_debug_code()) { | 
| +    AbortIfNotFixedArray(r3, r7); | 
| +  } | 
|  | 
| // Check that there is an enum cache in the non-empty instance | 
| // descriptors (r3).  This is the case if the next enumeration | 
|  |