Index: src/hydrogen-instructions.h |
diff --git a/src/hydrogen-instructions.h b/src/hydrogen-instructions.h |
index eac5173f7d00748bec37cba8a7bb68990113342c..dfa155f10a28cf12b1ad85e9eaf0afa7e043742b 100644 |
--- a/src/hydrogen-instructions.h |
+++ b/src/hydrogen-instructions.h |
@@ -6372,7 +6372,7 @@ class HLoadKeyedGeneric: public HTemplateInstruction<3> { |
}; |
-class HStoreNamedField: public HTemplateInstruction<2> { |
+class HStoreNamedField: public HTemplateInstruction<3> { |
public: |
DECLARE_INSTRUCTION_FACTORY_P3(HStoreNamedField, HValue*, |
HObjectAccess, HValue*); |
@@ -6404,24 +6404,37 @@ class HStoreNamedField: public HTemplateInstruction<2> { |
return write_barrier_mode_ == SKIP_WRITE_BARRIER; |
} |
- HValue* object() { return OperandAt(0); } |
- HValue* value() { return OperandAt(1); } |
+ HValue* object() const { return OperandAt(0); } |
+ HValue* value() const { return OperandAt(1); } |
+ HValue* transition() const { return OperandAt(2); } |
HObjectAccess access() const { return access_; } |
- Handle<Map> transition() const { return transition_; } |
- UniqueValueId transition_unique_id() const { return transition_unique_id_; } |
- void SetTransition(Handle<Map> map, CompilationInfo* info) { |
- ASSERT(transition_.is_null()); // Only set once. |
+ HValue* new_space_dominator() const { return new_space_dominator_; } |
+ |
+ bool has_transition() const { |
+ return transition() != object(); |
+ } |
+ |
+ Handle<Map> transition_map() const { |
+ if (has_transition()) { |
+ return Handle<Map>::cast(HConstant::cast(transition())->handle()); |
+ } else { |
+ return Handle<Map>(); |
+ } |
+ } |
+ |
+ void SetTransition(HConstant* map_constant, CompilationInfo* info) { |
+ ASSERT(!has_transition()); // Only set once. |
+ Handle<Map> map = Handle<Map>::cast(map_constant->handle()); |
if (map->CanBeDeprecated()) { |
map->AddDependentCompilationInfo(DependentCode::kTransitionGroup, info); |
} |
- transition_ = map; |
+ SetOperandAt(2, map_constant); |
} |
- HValue* new_space_dominator() const { return new_space_dominator_; } |
bool NeedsWriteBarrier() { |
ASSERT(!(FLAG_track_double_fields && field_representation().IsDouble()) || |
- transition_.is_null()); |
+ !has_transition()); |
if (IsSkipWriteBarrier()) return false; |
if (field_representation().IsDouble()) return false; |
if (field_representation().IsSmi()) return false; |
@@ -6436,10 +6449,6 @@ class HStoreNamedField: public HTemplateInstruction<2> { |
return ReceiverObjectNeedsWriteBarrier(object(), new_space_dominator()); |
} |
- virtual void FinalizeUniqueValueId() { |
- transition_unique_id_ = UniqueValueId(transition_); |
- } |
- |
Representation field_representation() const { |
return access_.representation(); |
} |
@@ -6449,18 +6458,15 @@ class HStoreNamedField: public HTemplateInstruction<2> { |
HObjectAccess access, |
HValue* val) |
: access_(access), |
- transition_(), |
- transition_unique_id_(), |
new_space_dominator_(NULL), |
write_barrier_mode_(UPDATE_WRITE_BARRIER) { |
SetOperandAt(0, obj); |
SetOperandAt(1, val); |
+ SetOperandAt(2, obj); |
access.SetGVNFlags(this, true); |
} |
HObjectAccess access_; |
- Handle<Map> transition_; |
- UniqueValueId transition_unique_id_; |
HValue* new_space_dominator_; |
WriteBarrierMode write_barrier_mode_; |
}; |