Index: src/ia32/stub-cache-ia32.cc |
diff --git a/src/ia32/stub-cache-ia32.cc b/src/ia32/stub-cache-ia32.cc |
index 2720711e2b701f47a822a559d4ac45eb886a8630..4db24742fe73886c44fef42ba7208c074af793c0 100644 |
--- a/src/ia32/stub-cache-ia32.cc |
+++ b/src/ia32/stub-cache-ia32.cc |
@@ -568,60 +568,27 @@ void NamedStoreHandlerCompiler::GenerateStoreTransition( |
} |
-// Both name_reg and receiver_reg are preserved on jumps to miss_label, |
-// but may be destroyed if store is successful. |
-void NamedStoreHandlerCompiler::GenerateStoreField( |
- Handle<JSObject> object, LookupResult* lookup, Register receiver_reg, |
- Register name_reg, Register value_reg, Register scratch1, Register scratch2, |
- Label* miss_label) { |
- // Stub never generated for objects that require access checks. |
- DCHECK(!object->IsAccessCheckNeeded()); |
- DCHECK(!object->IsJSGlobalProxy()); |
- |
- FieldIndex index = lookup->GetFieldIndex(); |
+void NamedStoreHandlerCompiler::GenerateStoreField(LookupResult* lookup, |
+ Register value_reg, |
+ Label* miss_label) { |
DCHECK(lookup->representation().IsHeapObject()); |
__ JumpIfSmi(value_reg, miss_label); |
- HeapType* field_type = lookup->GetFieldType(); |
- HeapType::Iterator<Map> it = field_type->Classes(); |
- if (!it.Done()) { |
- Label do_store; |
- while (true) { |
- __ CompareMap(value_reg, it.Current()); |
- it.Advance(); |
- if (it.Done()) { |
- __ j(not_equal, miss_label); |
- break; |
- } |
- __ j(equal, &do_store, Label::kNear); |
+ HeapType::Iterator<Map> it = lookup->GetFieldType()->Classes(); |
+ Label do_store; |
+ while (true) { |
+ __ CompareMap(value_reg, it.Current()); |
+ it.Advance(); |
+ if (it.Done()) { |
+ __ j(not_equal, miss_label); |
+ break; |
} |
- __ bind(&do_store); |
+ __ j(equal, &do_store, Label::kNear); |
} |
+ __ bind(&do_store); |
- if (index.is_inobject()) { |
- // Set the property straight into the object. |
- __ mov(FieldOperand(receiver_reg, index.offset()), value_reg); |
- |
- // Update the write barrier for the array address. |
- // Pass the value being stored in the now unused name_reg. |
- __ mov(name_reg, value_reg); |
- __ RecordWriteField(receiver_reg, index.offset(), name_reg, scratch1, |
- kDontSaveFPRegs, EMIT_REMEMBERED_SET, OMIT_SMI_CHECK); |
- } else { |
- // Write to the properties array. |
- // Get the properties array (optimistically). |
- __ mov(scratch1, FieldOperand(receiver_reg, JSObject::kPropertiesOffset)); |
- __ mov(FieldOperand(scratch1, index.offset()), value_reg); |
- |
- // Update the write barrier for the array address. |
- // Pass the value being stored in the now unused name_reg. |
- __ mov(name_reg, value_reg); |
- __ RecordWriteField(scratch1, index.offset(), name_reg, receiver_reg, |
- kDontSaveFPRegs, EMIT_REMEMBERED_SET, OMIT_SMI_CHECK); |
- } |
- |
- // Return the value (register eax). |
- DCHECK(value_reg.is(eax)); |
- __ ret(0); |
+ StoreFieldStub stub(isolate(), lookup->GetFieldIndex(), |
+ lookup->representation()); |
+ GenerateTailCall(masm(), stub.GetCode()); |
} |