Index: src/hydrogen-instructions.h |
diff --git a/src/hydrogen-instructions.h b/src/hydrogen-instructions.h |
index 08667c994197356d3080e5c99fd9ec7b83853be8..1735c4f0989be75845b4b84c71240a0e3fb8d601 100644 |
--- a/src/hydrogen-instructions.h |
+++ b/src/hydrogen-instructions.h |
@@ -87,6 +87,7 @@ class LChunkBuilder; |
V(CallNewArray) \ |
V(CallRuntime) \ |
V(CallStub) \ |
+ V(CapturedObject) \ |
V(Change) \ |
V(CheckFunction) \ |
V(CheckHeapObject) \ |
@@ -2946,6 +2947,7 @@ class HCheckHeapObject: public HUnaryOperation { |
set_type(HType::NonPrimitive()); |
} |
+ virtual bool HasEscapingOperandAt(int index) { return false; } |
virtual Representation RequiredInputRepresentation(int index) { |
return Representation::Tagged(); |
} |
@@ -3429,20 +3431,10 @@ class HInductionVariableAnnotation : public HUnaryOperation { |
}; |
-class HArgumentsObject: public HTemplateInstruction<0> { |
+// Common base class for HArgumentsObject and HCapturedObject. |
+class HDematerializedObject: public HTemplateInstruction<0> { |
public: |
- HArgumentsObject(int count, Zone* zone) : values_(count, zone) { |
- set_representation(Representation::Tagged()); |
- SetFlag(kIsArguments); |
- } |
- |
- const ZoneList<HValue*>* arguments_values() const { return &values_; } |
- int arguments_count() const { return values_.length(); } |
- |
- void AddArgument(HValue* argument, Zone* zone) { |
- values_.Add(NULL, zone); // Resize list. |
- SetOperandAt(values_.length() - 1, argument); |
- } |
+ HDematerializedObject(int count, Zone* zone) : values_(count, zone) {} |
virtual int OperandCount() { return values_.length(); } |
virtual HValue* OperandAt(int index) const { return values_[index]; } |
@@ -3452,17 +3444,56 @@ class HArgumentsObject: public HTemplateInstruction<0> { |
return Representation::None(); |
} |
- DECLARE_CONCRETE_INSTRUCTION(ArgumentsObject) |
- |
protected: |
virtual void InternalSetOperandAt(int index, HValue* value) { |
values_[index] = value; |
} |
+ // List of values tracked by this marker. |
+ ZoneList<HValue*> values_; |
+ |
private: |
virtual bool IsDeletable() const { return true; } |
+}; |
- ZoneList<HValue*> values_; |
+ |
+class HArgumentsObject: public HDematerializedObject { |
+ public: |
+ HArgumentsObject(int count, Zone* zone) |
+ : HDematerializedObject(count, zone) { |
+ set_representation(Representation::Tagged()); |
+ SetFlag(kIsArguments); |
+ } |
+ |
+ // The values contain a list of all elements in the arguments object |
+ // including the receiver object, which is skipped when materializing. |
+ const ZoneList<HValue*>* arguments_values() const { return &values_; } |
+ int arguments_count() const { return values_.length(); } |
+ |
+ void AddArgument(HValue* argument, Zone* zone) { |
+ values_.Add(NULL, zone); // Resize list. |
+ SetOperandAt(values_.length() - 1, argument); |
+ } |
+ |
+ DECLARE_CONCRETE_INSTRUCTION(ArgumentsObject) |
+}; |
+ |
+ |
+class HCapturedObject: public HDematerializedObject { |
+ public: |
+ HCapturedObject(int length, Zone* zone) |
+ : HDematerializedObject(length, zone) { |
+ set_representation(Representation::Tagged()); |
+ values_.AddBlock(NULL, length, zone); // Resize list. |
+ } |
+ |
+ // The values contain a list of all in-object properties inside the |
+ // captured object and is index by field index. Properties in the |
+ // properties or elements backing store are not tracked here. |
+ const ZoneList<HValue*>* values() const { return &values_; } |
+ int length() const { return values_.length(); } |
+ |
+ DECLARE_CONCRETE_INSTRUCTION(CapturedObject) |
}; |
@@ -6286,7 +6317,6 @@ class HStoreKeyed |
} |
} |
- virtual bool HasEscapingOperandAt(int index) { return index != 0; } |
virtual Representation RequiredInputRepresentation(int index) { |
// kind_fast: tagged[int32] = tagged |
// kind_double: tagged[int32] = double |