Index: src/ast.h |
diff --git a/src/ast.h b/src/ast.h |
index 8a13e21b1ef9929954f6a5301681bd5eaa21cbbc..3c07471a3055d305d942fc4ef900293ead012870 100644 |
--- a/src/ast.h |
+++ b/src/ast.h |
@@ -165,6 +165,25 @@ class FeedbackVectorRequirements { |
}; |
+class VariableICSlotPair FINAL { |
+ public: |
+ VariableICSlotPair(Variable* variable, FeedbackVectorICSlot slot) |
+ : variable_(variable), slot_(slot) {} |
+ VariableICSlotPair() |
+ : variable_(NULL), slot_(FeedbackVectorICSlot::Invalid()) {} |
+ |
+ Variable* variable() const { return variable_; } |
+ FeedbackVectorICSlot slot() const { return slot_; } |
+ |
+ private: |
+ Variable* variable_; |
+ FeedbackVectorICSlot slot_; |
+}; |
+ |
+ |
+typedef List<VariableICSlotPair> ICSlotCache; |
+ |
+ |
class AstProperties FINAL BASE_EMBEDDED { |
public: |
class Flags : public EnumSet<AstPropertiesFlag, int> {}; |
@@ -229,11 +248,12 @@ class AstNode: public ZoneObject { |
// not really nice, but multiple inheritance would introduce yet another |
// vtable entry per node, something we don't want for space reasons. |
virtual FeedbackVectorRequirements ComputeFeedbackRequirements( |
- Isolate* isolate) { |
+ Isolate* isolate, const ICSlotCache* cache) { |
return FeedbackVectorRequirements(0, 0); |
} |
virtual void SetFirstFeedbackSlot(FeedbackVectorSlot slot) { UNREACHABLE(); } |
- virtual void SetFirstFeedbackICSlot(FeedbackVectorICSlot slot) { |
+ virtual void SetFirstFeedbackICSlot(FeedbackVectorICSlot slot, |
+ ICSlotCache* cache) { |
UNREACHABLE(); |
} |
// Each ICSlot stores a kind of IC which the participating node should know. |
@@ -884,7 +904,7 @@ class ForInStatement FINAL : public ForEachStatement { |
// Type feedback information. |
virtual FeedbackVectorRequirements ComputeFeedbackRequirements( |
- Isolate* isolate) OVERRIDE { |
+ Isolate* isolate, const ICSlotCache* cache) OVERRIDE { |
return FeedbackVectorRequirements(1, 0); |
} |
void SetFirstFeedbackSlot(FeedbackVectorSlot slot) OVERRIDE { |
@@ -1646,13 +1666,10 @@ class VariableProxy FINAL : public Expression { |
} |
virtual FeedbackVectorRequirements ComputeFeedbackRequirements( |
- Isolate* isolate) OVERRIDE { |
- return FeedbackVectorRequirements(0, UsesVariableFeedbackSlot() ? 1 : 0); |
- } |
+ Isolate* isolate, const ICSlotCache* cache) OVERRIDE; |
- void SetFirstFeedbackICSlot(FeedbackVectorICSlot slot) OVERRIDE { |
- variable_feedback_slot_ = slot; |
- } |
+ void SetFirstFeedbackICSlot(FeedbackVectorICSlot slot, |
+ ICSlotCache* cache) OVERRIDE; |
Code::Kind FeedbackICSlotKind(int index) OVERRIDE { return Code::LOAD_IC; } |
FeedbackVectorICSlot VariableFeedbackSlot() { |
DCHECK(!UsesVariableFeedbackSlot() || !variable_feedback_slot_.IsInvalid()); |
@@ -1734,10 +1751,11 @@ class Property FINAL : public Expression { |
} |
virtual FeedbackVectorRequirements ComputeFeedbackRequirements( |
- Isolate* isolate) OVERRIDE { |
+ Isolate* isolate, const ICSlotCache* cache) OVERRIDE { |
return FeedbackVectorRequirements(0, FLAG_vector_ics ? 1 : 0); |
} |
- void SetFirstFeedbackICSlot(FeedbackVectorICSlot slot) OVERRIDE { |
+ void SetFirstFeedbackICSlot(FeedbackVectorICSlot slot, |
+ ICSlotCache* cache) OVERRIDE { |
property_feedback_slot_ = slot; |
} |
Code::Kind FeedbackICSlotKind(int index) OVERRIDE { |
@@ -1784,8 +1802,9 @@ class Call FINAL : public Expression { |
// Type feedback information. |
virtual FeedbackVectorRequirements ComputeFeedbackRequirements( |
- Isolate* isolate) OVERRIDE; |
- void SetFirstFeedbackICSlot(FeedbackVectorICSlot slot) OVERRIDE { |
+ Isolate* isolate, const ICSlotCache* cache) OVERRIDE; |
+ void SetFirstFeedbackICSlot(FeedbackVectorICSlot slot, |
+ ICSlotCache* cache) OVERRIDE { |
ic_slot_or_slot_ = slot.ToInt(); |
} |
void SetFirstFeedbackSlot(FeedbackVectorSlot slot) OVERRIDE { |
@@ -1907,7 +1926,7 @@ class CallNew FINAL : public Expression { |
// Type feedback information. |
virtual FeedbackVectorRequirements ComputeFeedbackRequirements( |
- Isolate* isolate) OVERRIDE { |
+ Isolate* isolate, const ICSlotCache* cache) OVERRIDE { |
return FeedbackVectorRequirements(FLAG_pretenuring_call_new ? 2 : 1, 0); |
} |
void SetFirstFeedbackSlot(FeedbackVectorSlot slot) OVERRIDE { |
@@ -1981,10 +2000,11 @@ class CallRuntime FINAL : public Expression { |
return FLAG_vector_ics && is_jsruntime(); |
} |
virtual FeedbackVectorRequirements ComputeFeedbackRequirements( |
- Isolate* isolate) OVERRIDE { |
+ Isolate* isolate, const ICSlotCache* cache) OVERRIDE { |
return FeedbackVectorRequirements(0, HasCallRuntimeFeedbackSlot() ? 1 : 0); |
} |
- void SetFirstFeedbackICSlot(FeedbackVectorICSlot slot) OVERRIDE { |
+ void SetFirstFeedbackICSlot(FeedbackVectorICSlot slot, |
+ ICSlotCache* cache) OVERRIDE { |
callruntime_feedback_slot_ = slot; |
} |
Code::Kind FeedbackICSlotKind(int index) OVERRIDE { return Code::LOAD_IC; } |
@@ -2354,10 +2374,11 @@ class Yield FINAL : public Expression { |
return FLAG_vector_ics && (yield_kind() == kDelegating); |
} |
virtual FeedbackVectorRequirements ComputeFeedbackRequirements( |
- Isolate* isolate) OVERRIDE { |
+ Isolate* isolate, const ICSlotCache* cache) OVERRIDE { |
return FeedbackVectorRequirements(0, HasFeedbackSlots() ? 3 : 0); |
} |
- void SetFirstFeedbackICSlot(FeedbackVectorICSlot slot) OVERRIDE { |
+ void SetFirstFeedbackICSlot(FeedbackVectorICSlot slot, |
+ ICSlotCache* cache) OVERRIDE { |
yield_first_feedback_slot_ = slot; |
} |
Code::Kind FeedbackICSlotKind(int index) OVERRIDE { |
@@ -2695,10 +2716,11 @@ class SuperReference FINAL : public Expression { |
// Type feedback information. |
virtual FeedbackVectorRequirements ComputeFeedbackRequirements( |
- Isolate* isolate) OVERRIDE { |
+ Isolate* isolate, const ICSlotCache* cache) OVERRIDE { |
return FeedbackVectorRequirements(0, FLAG_vector_ics ? 1 : 0); |
} |
- void SetFirstFeedbackICSlot(FeedbackVectorICSlot slot) OVERRIDE { |
+ void SetFirstFeedbackICSlot(FeedbackVectorICSlot slot, |
+ ICSlotCache* cache) OVERRIDE { |
homeobject_feedback_slot_ = slot; |
} |
Code::Kind FeedbackICSlotKind(int index) OVERRIDE { return Code::LOAD_IC; } |