| Index: src/hydrogen-instructions.h
|
| diff --git a/src/hydrogen-instructions.h b/src/hydrogen-instructions.h
|
| index ed6ab15c6f695019f1313011095a9807371a26d3..c6027dbbf38c074c3ec3c4629d46bf480f055349 100644
|
| --- a/src/hydrogen-instructions.h
|
| +++ b/src/hydrogen-instructions.h
|
| @@ -5321,6 +5321,10 @@ class HObjectAccess {
|
| return HObjectAccess(kArrayLengths, JSArray::kLengthOffset);
|
| }
|
|
|
| + static HObjectAccess ForAllocationSitePayload() {
|
| + return HObjectAccess(kInobject, AllocationSite::kPayloadOffset);
|
| + }
|
| +
|
| static HObjectAccess ForFixedArrayLength() {
|
| return HObjectAccess(kArrayLengths, FixedArray::kLengthOffset);
|
| }
|
| @@ -5337,8 +5341,16 @@ class HObjectAccess {
|
| return HObjectAccess(kMaps, JSObject::kMapOffset);
|
| }
|
|
|
| - static HObjectAccess ForAllocationSitePayload() {
|
| - return HObjectAccess(kInobject, AllocationSiteInfo::kPayloadOffset);
|
| + static HObjectAccess ForPropertyCellValue() {
|
| + return HObjectAccess(kInobject, PropertyCell::kValueOffset);
|
| + }
|
| +
|
| + static HObjectAccess ForCellValue() {
|
| + return HObjectAccess(kInobject, Cell::kValueOffset);
|
| + }
|
| +
|
| + static HObjectAccess ForAllocationSiteInfoSite() {
|
| + return HObjectAccess(kInobject, AllocationSiteInfo::kAllocationSiteOffset);
|
| }
|
|
|
| // Create an access to an offset in a fixed array header.
|
| @@ -5763,7 +5775,8 @@ class HStoreNamedField: public HTemplateInstruction<2> {
|
| field_representation_(field_representation),
|
| transition_(),
|
| transition_unique_id_(),
|
| - new_space_dominator_(NULL) {
|
| + new_space_dominator_(NULL),
|
| + write_barrier_mode_(UPDATE_WRITE_BARRIER) {
|
| SetOperandAt(0, obj);
|
| SetOperandAt(1, val);
|
| access.SetGVNFlags(this, true);
|
| @@ -5788,6 +5801,11 @@ class HStoreNamedField: public HTemplateInstruction<2> {
|
| }
|
| virtual void PrintDataTo(StringStream* stream);
|
|
|
| + void SkipWriteBarrier() { write_barrier_mode_ = SKIP_WRITE_BARRIER; }
|
| + bool IsSkipWriteBarrier() const {
|
| + return write_barrier_mode_ == SKIP_WRITE_BARRIER;
|
| + }
|
| +
|
| HValue* object() { return OperandAt(0); }
|
| HValue* value() { return OperandAt(1); }
|
|
|
| @@ -5806,6 +5824,7 @@ class HStoreNamedField: public HTemplateInstruction<2> {
|
| bool NeedsWriteBarrier() {
|
| ASSERT(!(FLAG_track_double_fields && field_representation_.IsDouble()) ||
|
| transition_.is_null());
|
| + if (IsSkipWriteBarrier()) return false;
|
| return (!FLAG_track_fields || !field_representation_.IsSmi()) &&
|
| // If there is a transition, a new storage object needs to be allocated.
|
| !(FLAG_track_double_fields && field_representation_.IsDouble()) &&
|
| @@ -5814,6 +5833,7 @@ class HStoreNamedField: public HTemplateInstruction<2> {
|
| }
|
|
|
| bool NeedsWriteBarrierForMap() {
|
| + if (IsSkipWriteBarrier()) return false;
|
| return ReceiverObjectNeedsWriteBarrier(object(), new_space_dominator());
|
| }
|
|
|
| @@ -5831,6 +5851,7 @@ class HStoreNamedField: public HTemplateInstruction<2> {
|
| Handle<Map> transition_;
|
| UniqueValueId transition_unique_id_;
|
| HValue* new_space_dominator_;
|
| + WriteBarrierMode write_barrier_mode_;
|
| };
|
|
|
|
|
|
|