| Index: src/ast.h
|
| diff --git a/src/ast.h b/src/ast.h
|
| index b4aab4ec98d85c5c3f16c9e289f9ba5ee9384619..5a4a5ac6679e636a5dbed86fa5df852a210e45f3 100644
|
| --- a/src/ast.h
|
| +++ b/src/ast.h
|
| @@ -1625,7 +1625,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)
|
|
|
| @@ -1647,6 +1647,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);
|
|
|
| @@ -1661,10 +1668,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)
|
|
|
| @@ -1700,6 +1708,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,
|
| @@ -1709,6 +1724,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),
|
| @@ -1718,6 +1734,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;
|
| @@ -1895,7 +1912,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)
|
|
|
| @@ -1905,6 +1922,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:
|
| @@ -1922,6 +1953,7 @@ class CallRuntime V8_FINAL : public Expression {
|
| const AstRawString* raw_name_;
|
| const Runtime::Function* function_;
|
| ZoneList<Expression*>* arguments_;
|
| + int callruntime_feedback_slot_;
|
| };
|
|
|
|
|
| @@ -2215,7 +2247,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)
|
|
|
| @@ -2242,6 +2274,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,
|
| @@ -2252,13 +2307,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_;
|
| };
|
|
|
|
|
|
|