| Index: src/ia32/code-stubs-ia32.cc
 | 
| diff --git a/src/ia32/code-stubs-ia32.cc b/src/ia32/code-stubs-ia32.cc
 | 
| index 4e4a60923228d28b659bf2f8d24ca1ec0802cf4b..35bda31f90fa8a47bcd61345ec1d2a771e895f98 100644
 | 
| --- a/src/ia32/code-stubs-ia32.cc
 | 
| +++ b/src/ia32/code-stubs-ia32.cc
 | 
| @@ -3317,6 +3317,70 @@ void StringLengthStub::Generate(MacroAssembler* masm) {
 | 
|  }
 | 
|  
 | 
|  
 | 
| +void StoreArrayLengthStub::Generate(MacroAssembler* masm) {
 | 
| +  // ----------- S t a t e -------------
 | 
| +  //  -- eax    : value
 | 
| +  //  -- ecx    : name
 | 
| +  //  -- edx    : receiver
 | 
| +  //  -- esp[0] : return address
 | 
| +  // -----------------------------------
 | 
| +  //
 | 
| +  // This accepts as a receiver anything JSArray::SetElementsLength accepts
 | 
| +  // (currently anything except for external arrays which means anything with
 | 
| +  // elements of FixedArray type).  Value must be a number, but only smis are
 | 
| +  // accepted as the most common case.
 | 
| +
 | 
| +  Label miss;
 | 
| +
 | 
| +  Register receiver = edx;
 | 
| +  Register value = eax;
 | 
| +  Register scratch = ebx;
 | 
| +
 | 
| +  if (kind() == Code::KEYED_LOAD_IC) {
 | 
| +    __ cmp(ecx, Immediate(masm->isolate()->factory()->length_symbol()));
 | 
| +    __ j(not_equal, &miss);
 | 
| +  }
 | 
| +
 | 
| +  // Check that the receiver isn't a smi.
 | 
| +  __ JumpIfSmi(receiver, &miss);
 | 
| +
 | 
| +  // Check that the object is a JS array.
 | 
| +  __ CmpObjectType(receiver, JS_ARRAY_TYPE, scratch);
 | 
| +  __ j(not_equal, &miss);
 | 
| +
 | 
| +  // Check that elements are FixedArray.
 | 
| +  // We rely on StoreIC_ArrayLength below to deal with all types of
 | 
| +  // fast elements (including COW).
 | 
| +  __ mov(scratch, FieldOperand(receiver, JSArray::kElementsOffset));
 | 
| +  __ CmpObjectType(scratch, FIXED_ARRAY_TYPE, scratch);
 | 
| +  __ j(not_equal, &miss);
 | 
| +
 | 
| +  // Check that the array has fast properties, otherwise the length
 | 
| +  // property might have been redefined.
 | 
| +  __ mov(scratch, FieldOperand(receiver, JSArray::kPropertiesOffset));
 | 
| +  __ CompareRoot(FieldOperand(scratch, FixedArray::kMapOffset),
 | 
| +                 Heap::kHashTableMapRootIndex);
 | 
| +  __ j(equal, &miss);
 | 
| +
 | 
| +  // Check that value is a smi.
 | 
| +  __ JumpIfNotSmi(value, &miss);
 | 
| +
 | 
| +  // Prepare tail call to StoreIC_ArrayLength.
 | 
| +  __ pop(scratch);
 | 
| +  __ push(receiver);
 | 
| +  __ push(value);
 | 
| +  __ push(scratch);  // return address
 | 
| +
 | 
| +  ExternalReference ref =
 | 
| +      ExternalReference(IC_Utility(IC::kStoreIC_ArrayLength), masm->isolate());
 | 
| +  __ TailCallExternalReference(ref, 2, 1);
 | 
| +
 | 
| +  __ bind(&miss);
 | 
| +
 | 
| +  StubCompiler::GenerateStoreMiss(masm, kind());
 | 
| +}
 | 
| +
 | 
| +
 | 
|  void ArgumentsAccessStub::GenerateReadElement(MacroAssembler* masm) {
 | 
|    // The key is in edx and the parameter count is in eax.
 | 
|  
 | 
| 
 |