Index: src/ast.h |
diff --git a/src/ast.h b/src/ast.h |
index 1a56b32c00e9d1ea96a6c31a58d82b135a133463..0909b954b6893bef7141e1b3adf4ffdfe81d67d8 100644 |
--- a/src/ast.h |
+++ b/src/ast.h |
@@ -1399,7 +1399,38 @@ class ObjectLiteralProperty final : public ZoneObject { |
bool is_static() const { return is_static_; } |
bool is_computed_name() const { return is_computed_name_; } |
+ FeedbackVectorICSlot GetSlot(int offset = 0) const { |
+ if (ic_slot_or_count_ == FeedbackVectorICSlot::Invalid().ToInt()) { |
+ return FeedbackVectorICSlot::Invalid(); |
+ } |
+ return FeedbackVectorICSlot(ic_slot_or_count_ + offset); |
+ } |
+ |
+ int ic_slot_count() const { |
+ if (ic_slot_or_count_ == FeedbackVectorICSlot::Invalid().ToInt()) { |
+ return 0; |
+ } |
+ return ic_slot_or_count_; |
+ } |
+ |
void set_receiver_type(Handle<Map> map) { receiver_type_ = map; } |
+ void set_ic_slot_count(int count) { |
+ // Should only be called once. |
+ if (count == 0) { |
+ ic_slot_or_count_ = FeedbackVectorICSlot::Invalid().ToInt(); |
+ } else { |
+ ic_slot_or_count_ = count; |
+ } |
+ } |
+ |
+ int set_base_slot(int slot) { |
+ if (ic_slot_count() > 0) { |
+ int count = ic_slot_count(); |
+ ic_slot_or_count_ = slot; |
+ return count; |
+ } |
+ return 0; |
+ } |
protected: |
friend class AstNodeFactory; |
@@ -1413,6 +1444,7 @@ class ObjectLiteralProperty final : public ZoneObject { |
private: |
Expression* key_; |
Expression* value_; |
+ int ic_slot_or_count_; |
Kind kind_; |
bool emit_store_; |
bool is_static_; |
@@ -1477,8 +1509,8 @@ class ObjectLiteral final : public MaterializedLiteral { |
struct Accessors: public ZoneObject { |
Accessors() : getter(NULL), setter(NULL) {} |
- Expression* getter; |
- Expression* setter; |
+ ObjectLiteralProperty* getter; |
+ ObjectLiteralProperty* setter; |
}; |
BailoutId CreateLiteralId() const { return BailoutId(local_id(0)); } |
@@ -1499,18 +1531,10 @@ class ObjectLiteral final : public MaterializedLiteral { |
slot_ = slot; |
} |
Code::Kind FeedbackICSlotKind(int index) override { return Code::STORE_IC; } |
- FeedbackVectorICSlot GetNthSlot(int n) const { |
- return FeedbackVectorICSlot(slot_.ToInt() + n); |
- } |
- // If value needs a home object, returns a valid feedback vector ic slot |
- // given by slot_index, and increments slot_index. |
- FeedbackVectorICSlot SlotForHomeObject(Expression* value, |
- int* slot_index) const; |
- |
-#ifdef DEBUG |
- int slot_count() const { return slot_count_; } |
-#endif |
+ // After feedback slots were assigned, propagate information to the properties |
+ // which need it. |
+ void LayoutFeedbackSlots(); |
protected: |
ObjectLiteral(Zone* zone, ZoneList<Property*>* properties, int literal_index, |
@@ -1523,9 +1547,6 @@ class ObjectLiteral final : public MaterializedLiteral { |
has_elements_(false), |
may_store_doubles_(false), |
has_function_(has_function), |
-#ifdef DEBUG |
- slot_count_(0), |
-#endif |
slot_(FeedbackVectorICSlot::Invalid()) { |
} |
static int parent_num_ids() { return MaterializedLiteral::num_ids(); } |
@@ -1539,11 +1560,6 @@ class ObjectLiteral final : public MaterializedLiteral { |
bool has_elements_; |
bool may_store_doubles_; |
bool has_function_; |
-#ifdef DEBUG |
- // slot_count_ helps validate that the logic to allocate ic slots and the |
- // logic to use them are in sync. |
- int slot_count_; |
-#endif |
FeedbackVectorICSlot slot_; |
}; |
@@ -2714,18 +2730,17 @@ class ClassLiteral final : public Expression { |
slot_ = slot; |
} |
Code::Kind FeedbackICSlotKind(int index) override { return Code::STORE_IC; } |
- FeedbackVectorICSlot GetNthSlot(int n) const { |
- return FeedbackVectorICSlot(slot_.ToInt() + n); |
+ |
+ bool NeedsProxySlot() const { |
+ return FLAG_vector_stores && scope() != NULL && |
+ class_variable_proxy()->var()->IsUnallocated(); |
} |
- // If value needs a home object, returns a valid feedback vector ic slot |
- // given by slot_index, and increments slot_index. |
- FeedbackVectorICSlot SlotForHomeObject(Expression* value, |
- int* slot_index) const; |
+ FeedbackVectorICSlot ProxySlot() const { return slot_; } |
-#ifdef DEBUG |
- int slot_count() const { return slot_count_; } |
-#endif |
+ // After feedback slots were assigned, propagate information to the properties |
+ // which need it. |
+ void LayoutFeedbackSlots(); |
protected: |
ClassLiteral(Zone* zone, const AstRawString* name, Scope* scope, |
@@ -2740,9 +2755,6 @@ class ClassLiteral final : public Expression { |
constructor_(constructor), |
properties_(properties), |
end_position_(end_position), |
-#ifdef DEBUG |
- slot_count_(0), |
-#endif |
slot_(FeedbackVectorICSlot::Invalid()) { |
} |
@@ -2758,11 +2770,6 @@ class ClassLiteral final : public Expression { |
FunctionLiteral* constructor_; |
ZoneList<Property*>* properties_; |
int end_position_; |
-#ifdef DEBUG |
- // slot_count_ helps validate that the logic to allocate ic slots and the |
- // logic to use them are in sync. |
- int slot_count_; |
-#endif |
FeedbackVectorICSlot slot_; |
}; |