| Index: src/ast.h | 
| diff --git a/src/ast.h b/src/ast.h | 
| index aecee37b602f922f8629e21dd5cbeb2d9837b608..c654feac97deb91617860527c5fe27f9f86e0a23 100644 | 
| --- a/src/ast.h | 
| +++ b/src/ast.h | 
| @@ -1617,7 +1617,7 @@ class ArrayLiteral V8_FINAL : public MaterializedLiteral { | 
| }; | 
|  | 
|  | 
| -class VariableProxy V8_FINAL : public Expression { | 
| +class VariableProxy V8_FINAL : public Expression, public FeedbackSlotInterface { | 
| public: | 
| DECLARE_NODE_TYPE(VariableProxy) | 
|  | 
| @@ -1639,6 +1639,13 @@ class VariableProxy V8_FINAL : public Expression { | 
| // Bind this proxy to the variable var. Interfaces must match. | 
| void BindTo(Variable* var); | 
|  | 
| +  virtual int ComputeFeedbackSlotCount() { return FLAG_vector_ics ? 1 : 0; } | 
| +  virtual void SetFirstFeedbackSlot(int slot) { | 
| +    variable_feedback_slot_ = slot; | 
| +  } | 
| + | 
| +  int VariableFeedbackSlot() { return variable_feedback_slot_; } | 
| + | 
| protected: | 
| VariableProxy(Zone* zone, Variable* var, int position); | 
|  | 
| @@ -1653,10 +1660,11 @@ class VariableProxy V8_FINAL : public Expression { | 
| bool is_this_; | 
| bool is_assigned_; | 
| Interface* interface_; | 
| +  int variable_feedback_slot_; | 
| }; | 
|  | 
|  | 
| -class Property V8_FINAL : public Expression { | 
| +class Property V8_FINAL : public Expression, public FeedbackSlotInterface { | 
| public: | 
| DECLARE_NODE_TYPE(Property) | 
|  | 
| @@ -1692,6 +1700,13 @@ class Property V8_FINAL : public Expression { | 
|  | 
| TypeFeedbackId PropertyFeedbackId() { return reuse(id()); } | 
|  | 
| +  virtual int ComputeFeedbackSlotCount() { return FLAG_vector_ics ? 1 : 0; } | 
| +  virtual void SetFirstFeedbackSlot(int slot) { | 
| +    property_feedback_slot_ = slot; | 
| +  } | 
| + | 
| +  int PropertyFeedbackSlot() const { return property_feedback_slot_; } | 
| + | 
| protected: | 
| Property(Zone* zone, | 
| Expression* obj, | 
| @@ -1701,6 +1716,7 @@ class Property V8_FINAL : public Expression { | 
| obj_(obj), | 
| key_(key), | 
| load_id_(GetNextId(zone)), | 
| +        property_feedback_slot_(kInvalidFeedbackSlot), | 
| is_for_call_(false), | 
| is_uninitialized_(false), | 
| is_string_access_(false), | 
| @@ -1710,6 +1726,7 @@ class Property V8_FINAL : public Expression { | 
| Expression* obj_; | 
| Expression* key_; | 
| const BailoutId load_id_; | 
| +  int property_feedback_slot_; | 
|  | 
| SmallMapList receiver_types_; | 
| bool is_for_call_ : 1; | 
| @@ -1887,7 +1904,7 @@ class CallNew V8_FINAL : public Expression, public FeedbackSlotInterface { | 
| // language construct. Instead it is used to call a C or JS function | 
| // with a set of arguments. This is used from the builtins that are | 
| // implemented in JavaScript (see "v8natives.js"). | 
| -class CallRuntime V8_FINAL : public Expression { | 
| +class CallRuntime V8_FINAL : public Expression, public FeedbackSlotInterface { | 
| public: | 
| DECLARE_NODE_TYPE(CallRuntime) | 
|  | 
| @@ -1897,6 +1914,20 @@ class CallRuntime V8_FINAL : public Expression { | 
| ZoneList<Expression*>* arguments() const { return arguments_; } | 
| bool is_jsruntime() const { return function_ == NULL; } | 
|  | 
| +  // Type feedback information. | 
| +  virtual int ComputeFeedbackSlotCount() { | 
| +    return (FLAG_vector_ics && is_jsruntime()) ? 1 : 0; | 
| +  } | 
| +  virtual void SetFirstFeedbackSlot(int slot) { | 
| +    callruntime_feedback_slot_ = slot; | 
| +  } | 
| + | 
| +  int CallRuntimeFeedbackSlot() { | 
| +    ASSERT(!is_jsruntime() || | 
| +           callruntime_feedback_slot_ != kInvalidFeedbackSlot); | 
| +    return callruntime_feedback_slot_; | 
| +  } | 
| + | 
| TypeFeedbackId CallRuntimeFeedbackId() const { return reuse(id()); } | 
|  | 
| protected: | 
| @@ -1914,6 +1945,7 @@ class CallRuntime V8_FINAL : public Expression { | 
| const AstRawString* raw_name_; | 
| const Runtime::Function* function_; | 
| ZoneList<Expression*>* arguments_; | 
| +  int callruntime_feedback_slot_; | 
| }; | 
|  | 
|  | 
| @@ -2207,7 +2239,7 @@ class Assignment V8_FINAL : public Expression { | 
| }; | 
|  | 
|  | 
| -class Yield V8_FINAL : public Expression { | 
| +class Yield V8_FINAL : public Expression, public FeedbackSlotInterface { | 
| public: | 
| DECLARE_NODE_TYPE(Yield) | 
|  | 
| @@ -2234,6 +2266,29 @@ class Yield V8_FINAL : public Expression { | 
| index_ = index; | 
| } | 
|  | 
| +  // Type feedback information. | 
| +  virtual int ComputeFeedbackSlotCount() { | 
| +    return (FLAG_vector_ics && yield_kind() == DELEGATING) ? 3 : 0; | 
| +  } | 
| +  virtual void SetFirstFeedbackSlot(int slot) { | 
| +    yield_first_feedback_slot_ = slot; | 
| +  } | 
| + | 
| +  int KeyedLoadFeedbackSlot() { | 
| +    ASSERT(yield_first_feedback_slot_ != kInvalidFeedbackSlot); | 
| +    return yield_first_feedback_slot_; | 
| +  } | 
| + | 
| +  int DoneFeedbackSlot() { | 
| +    ASSERT(yield_first_feedback_slot_ != kInvalidFeedbackSlot); | 
| +    return yield_first_feedback_slot_ + 1; | 
| +  } | 
| + | 
| +  int ValueFeedbackSlot() { | 
| +    ASSERT(yield_first_feedback_slot_ != kInvalidFeedbackSlot); | 
| +    return yield_first_feedback_slot_ + 2; | 
| +  } | 
| + | 
| protected: | 
| Yield(Zone* zone, | 
| Expression* generator_object, | 
| @@ -2244,13 +2299,15 @@ class Yield V8_FINAL : public Expression { | 
| generator_object_(generator_object), | 
| expression_(expression), | 
| yield_kind_(yield_kind), | 
| -        index_(-1) { } | 
| +        index_(-1), | 
| +        yield_first_feedback_slot_(kInvalidFeedbackSlot) { } | 
|  | 
| private: | 
| Expression* generator_object_; | 
| Expression* expression_; | 
| Kind yield_kind_; | 
| int index_; | 
| +  int yield_first_feedback_slot_; | 
| }; | 
|  | 
|  | 
|  |