| Index: src/ast.h
|
| diff --git a/src/ast.h b/src/ast.h
|
| index 1f227b90b11ff1d628f1a42a8029aa15245d8437..f0dd6fd910f4780a11f002cd830f3ff2befd39e0 100644
|
| --- a/src/ast.h
|
| +++ b/src/ast.h
|
| @@ -238,12 +238,11 @@ class AstNode: public ZoneObject {
|
| // node types which don't actually have this. Note that this is conceptually
|
| // not really nice, but multiple inheritance would introduce yet another
|
| // vtable entry per node, something we don't want for space reasons.
|
| - static const int kInvalidFeedbackSlot = -1;
|
| virtual int ComputeFeedbackSlotCount() {
|
| UNREACHABLE();
|
| return 0;
|
| }
|
| - virtual void SetFirstFeedbackSlot(int slot) { UNREACHABLE(); }
|
| + virtual void SetFirstFeedbackSlot(FeedbackVectorSlot slot) { UNREACHABLE(); }
|
|
|
| protected:
|
| // Some nodes re-use bailout IDs for type feedback.
|
| @@ -941,10 +940,12 @@ class ForInStatement FINAL : public ForEachStatement {
|
|
|
| // Type feedback information.
|
| virtual int ComputeFeedbackSlotCount() { return 1; }
|
| - virtual void SetFirstFeedbackSlot(int slot) { for_in_feedback_slot_ = slot; }
|
| + virtual void SetFirstFeedbackSlot(FeedbackVectorSlot slot) {
|
| + for_in_feedback_slot_ = slot;
|
| + }
|
|
|
| - int ForInFeedbackSlot() {
|
| - DCHECK(for_in_feedback_slot_ != kInvalidFeedbackSlot);
|
| + FeedbackVectorSlot ForInFeedbackSlot() {
|
| + DCHECK(!for_in_feedback_slot_.IsInvalid());
|
| return for_in_feedback_slot_;
|
| }
|
|
|
| @@ -962,12 +963,12 @@ class ForInStatement FINAL : public ForEachStatement {
|
| IdGen* id_gen)
|
| : ForEachStatement(zone, labels, pos, id_gen),
|
| for_in_type_(SLOW_FOR_IN),
|
| - for_in_feedback_slot_(kInvalidFeedbackSlot),
|
| + for_in_feedback_slot_(FeedbackVectorSlot::Invalid()),
|
| body_id_(id_gen->GetNextId()),
|
| prepare_id_(id_gen->GetNextId()) {}
|
|
|
| ForInType for_in_type_;
|
| - int for_in_feedback_slot_;
|
| + FeedbackVectorSlot for_in_feedback_slot_;
|
| const BailoutId body_id_;
|
| const BailoutId prepare_id_;
|
| };
|
| @@ -1672,11 +1673,11 @@ class VariableProxy FINAL : public Expression {
|
| void BindTo(Variable* var);
|
|
|
| virtual int ComputeFeedbackSlotCount() { return FLAG_vector_ics ? 1 : 0; }
|
| - virtual void SetFirstFeedbackSlot(int slot) {
|
| + virtual void SetFirstFeedbackSlot(FeedbackVectorSlot slot) {
|
| variable_feedback_slot_ = slot;
|
| }
|
|
|
| - int VariableFeedbackSlot() { return variable_feedback_slot_; }
|
| + FeedbackVectorSlot VariableFeedbackSlot() { return variable_feedback_slot_; }
|
|
|
| protected:
|
| VariableProxy(Zone* zone, Variable* var, int position, IdGen* id_gen);
|
| @@ -1689,7 +1690,7 @@ class VariableProxy FINAL : public Expression {
|
| Variable* var_; // if is_resolved_
|
| };
|
| Interface* interface_;
|
| - int variable_feedback_slot_;
|
| + FeedbackVectorSlot variable_feedback_slot_;
|
| bool is_this_ : 1;
|
| bool is_assigned_ : 1;
|
| bool is_resolved_ : 1;
|
| @@ -1735,11 +1736,13 @@ class Property FINAL : public Expression {
|
| TypeFeedbackId PropertyFeedbackId() { return reuse(id()); }
|
|
|
| virtual int ComputeFeedbackSlotCount() { return FLAG_vector_ics ? 1 : 0; }
|
| - virtual void SetFirstFeedbackSlot(int slot) {
|
| + virtual void SetFirstFeedbackSlot(FeedbackVectorSlot slot) {
|
| property_feedback_slot_ = slot;
|
| }
|
|
|
| - int PropertyFeedbackSlot() const { return property_feedback_slot_; }
|
| + FeedbackVectorSlot PropertyFeedbackSlot() const {
|
| + return property_feedback_slot_;
|
| + }
|
|
|
| protected:
|
| Property(Zone* zone, Expression* obj, Expression* key, int pos, IdGen* id_gen)
|
| @@ -1747,7 +1750,7 @@ class Property FINAL : public Expression {
|
| obj_(obj),
|
| key_(key),
|
| load_id_(id_gen->GetNextId()),
|
| - property_feedback_slot_(kInvalidFeedbackSlot),
|
| + property_feedback_slot_(FeedbackVectorSlot::Invalid()),
|
| is_for_call_(false),
|
| is_uninitialized_(false),
|
| is_string_access_(false) {}
|
| @@ -1756,7 +1759,7 @@ class Property FINAL : public Expression {
|
| Expression* obj_;
|
| Expression* key_;
|
| const BailoutId load_id_;
|
| - int property_feedback_slot_;
|
| + FeedbackVectorSlot property_feedback_slot_;
|
|
|
| SmallMapList receiver_types_;
|
| bool is_for_call_ : 1;
|
| @@ -1774,14 +1777,12 @@ class Call FINAL : public Expression {
|
|
|
| // Type feedback information.
|
| virtual int ComputeFeedbackSlotCount() { return 1; }
|
| - virtual void SetFirstFeedbackSlot(int slot) {
|
| + virtual void SetFirstFeedbackSlot(FeedbackVectorSlot slot) {
|
| call_feedback_slot_ = slot;
|
| }
|
|
|
| - bool HasCallFeedbackSlot() const {
|
| - return call_feedback_slot_ != kInvalidFeedbackSlot;
|
| - }
|
| - int CallFeedbackSlot() const { return call_feedback_slot_; }
|
| + bool HasCallFeedbackSlot() const { return !call_feedback_slot_.IsInvalid(); }
|
| + FeedbackVectorSlot CallFeedbackSlot() const { return call_feedback_slot_; }
|
|
|
| virtual SmallMapList* GetReceiverTypes() OVERRIDE {
|
| if (expression()->IsProperty()) {
|
| @@ -1844,7 +1845,7 @@ class Call FINAL : public Expression {
|
| : Expression(zone, pos, id_gen),
|
| expression_(expression),
|
| arguments_(arguments),
|
| - call_feedback_slot_(kInvalidFeedbackSlot),
|
| + call_feedback_slot_(FeedbackVectorSlot::Invalid()),
|
| return_id_(id_gen->GetNextId()),
|
| eval_or_lookup_id_(id_gen->GetNextId()) {
|
| if (expression->IsProperty()) {
|
| @@ -1859,7 +1860,7 @@ class Call FINAL : public Expression {
|
| Handle<JSFunction> target_;
|
| Handle<Cell> cell_;
|
| Handle<AllocationSite> allocation_site_;
|
| - int call_feedback_slot_;
|
| + FeedbackVectorSlot call_feedback_slot_;
|
|
|
| const BailoutId return_id_;
|
| // TODO(jarin) Only allocate the bailout id for the POSSIBLY_EVAL_CALL and
|
| @@ -1879,18 +1880,14 @@ class CallNew FINAL : public Expression {
|
| virtual int ComputeFeedbackSlotCount() {
|
| return FLAG_pretenuring_call_new ? 2 : 1;
|
| }
|
| - virtual void SetFirstFeedbackSlot(int slot) {
|
| + virtual void SetFirstFeedbackSlot(FeedbackVectorSlot slot) {
|
| callnew_feedback_slot_ = slot;
|
| }
|
|
|
| - int CallNewFeedbackSlot() {
|
| - DCHECK(callnew_feedback_slot_ != kInvalidFeedbackSlot);
|
| - return callnew_feedback_slot_;
|
| - }
|
| - int AllocationSiteFeedbackSlot() {
|
| - DCHECK(callnew_feedback_slot_ != kInvalidFeedbackSlot);
|
| + FeedbackVectorSlot CallNewFeedbackSlot() { return callnew_feedback_slot_; }
|
| + FeedbackVectorSlot AllocationSiteFeedbackSlot() {
|
| DCHECK(FLAG_pretenuring_call_new);
|
| - return callnew_feedback_slot_ + 1;
|
| + return CallNewFeedbackSlot().next();
|
| }
|
|
|
| void RecordTypeFeedback(TypeFeedbackOracle* oracle);
|
| @@ -1911,7 +1908,7 @@ class CallNew FINAL : public Expression {
|
| expression_(expression),
|
| arguments_(arguments),
|
| is_monomorphic_(false),
|
| - callnew_feedback_slot_(kInvalidFeedbackSlot),
|
| + callnew_feedback_slot_(FeedbackVectorSlot::Invalid()),
|
| return_id_(id_gen->GetNextId()) {}
|
|
|
| private:
|
| @@ -1921,7 +1918,7 @@ class CallNew FINAL : public Expression {
|
| bool is_monomorphic_;
|
| Handle<JSFunction> target_;
|
| Handle<AllocationSite> allocation_site_;
|
| - int callnew_feedback_slot_;
|
| + FeedbackVectorSlot callnew_feedback_slot_;
|
|
|
| const BailoutId return_id_;
|
| };
|
| @@ -1945,13 +1942,11 @@ class CallRuntime FINAL : public Expression {
|
| virtual int ComputeFeedbackSlotCount() {
|
| return (FLAG_vector_ics && is_jsruntime()) ? 1 : 0;
|
| }
|
| - virtual void SetFirstFeedbackSlot(int slot) {
|
| + virtual void SetFirstFeedbackSlot(FeedbackVectorSlot slot) {
|
| callruntime_feedback_slot_ = slot;
|
| }
|
|
|
| - int CallRuntimeFeedbackSlot() {
|
| - DCHECK(!is_jsruntime() ||
|
| - callruntime_feedback_slot_ != kInvalidFeedbackSlot);
|
| + FeedbackVectorSlot CallRuntimeFeedbackSlot() {
|
| return callruntime_feedback_slot_;
|
| }
|
|
|
| @@ -1964,13 +1959,14 @@ class CallRuntime FINAL : public Expression {
|
| : Expression(zone, pos, id_gen),
|
| raw_name_(name),
|
| function_(function),
|
| - arguments_(arguments) {}
|
| + arguments_(arguments),
|
| + callruntime_feedback_slot_(FeedbackVectorSlot::Invalid()) {}
|
|
|
| private:
|
| const AstRawString* raw_name_;
|
| const Runtime::Function* function_;
|
| ZoneList<Expression*>* arguments_;
|
| - int callruntime_feedback_slot_;
|
| + FeedbackVectorSlot callruntime_feedback_slot_;
|
| };
|
|
|
|
|
| @@ -2278,24 +2274,19 @@ class Yield FINAL : public Expression {
|
| virtual int ComputeFeedbackSlotCount() {
|
| return (FLAG_vector_ics && yield_kind() == kDelegating) ? 3 : 0;
|
| }
|
| - virtual void SetFirstFeedbackSlot(int slot) {
|
| + virtual void SetFirstFeedbackSlot(FeedbackVectorSlot slot) {
|
| yield_first_feedback_slot_ = slot;
|
| }
|
|
|
| - int KeyedLoadFeedbackSlot() {
|
| - DCHECK(yield_first_feedback_slot_ != kInvalidFeedbackSlot);
|
| + FeedbackVectorSlot KeyedLoadFeedbackSlot() {
|
| return yield_first_feedback_slot_;
|
| }
|
|
|
| - int DoneFeedbackSlot() {
|
| - DCHECK(yield_first_feedback_slot_ != kInvalidFeedbackSlot);
|
| - return yield_first_feedback_slot_ + 1;
|
| + FeedbackVectorSlot DoneFeedbackSlot() {
|
| + return KeyedLoadFeedbackSlot().next();
|
| }
|
|
|
| - int ValueFeedbackSlot() {
|
| - DCHECK(yield_first_feedback_slot_ != kInvalidFeedbackSlot);
|
| - return yield_first_feedback_slot_ + 2;
|
| - }
|
| + FeedbackVectorSlot ValueFeedbackSlot() { return DoneFeedbackSlot().next(); }
|
|
|
| protected:
|
| Yield(Zone* zone, Expression* generator_object, Expression* expression,
|
| @@ -2305,14 +2296,14 @@ class Yield FINAL : public Expression {
|
| expression_(expression),
|
| yield_kind_(yield_kind),
|
| index_(-1),
|
| - yield_first_feedback_slot_(kInvalidFeedbackSlot) {}
|
| + yield_first_feedback_slot_(FeedbackVectorSlot::Invalid()) {}
|
|
|
| private:
|
| Expression* generator_object_;
|
| Expression* expression_;
|
| Kind yield_kind_;
|
| int index_;
|
| - int yield_first_feedback_slot_;
|
| + FeedbackVectorSlot yield_first_feedback_slot_;
|
| };
|
|
|
|
|
| @@ -2599,13 +2590,12 @@ class SuperReference FINAL : public Expression {
|
|
|
| // Type feedback information.
|
| virtual int ComputeFeedbackSlotCount() { return FLAG_vector_ics ? 1 : 0; }
|
| - virtual void SetFirstFeedbackSlot(int slot) {
|
| + virtual void SetFirstFeedbackSlot(FeedbackVectorSlot slot) {
|
| homeobject_feedback_slot_ = slot;
|
| }
|
|
|
| - int HomeObjectFeedbackSlot() {
|
| - DCHECK(!FLAG_vector_ics ||
|
| - homeobject_feedback_slot_ != kInvalidFeedbackSlot);
|
| + FeedbackVectorSlot HomeObjectFeedbackSlot() {
|
| + DCHECK(!FLAG_vector_ics || !homeobject_feedback_slot_.IsInvalid());
|
| return homeobject_feedback_slot_;
|
| }
|
|
|
| @@ -2613,12 +2603,12 @@ class SuperReference FINAL : public Expression {
|
| SuperReference(Zone* zone, VariableProxy* this_var, int pos, IdGen* id_gen)
|
| : Expression(zone, pos, id_gen),
|
| this_var_(this_var),
|
| - homeobject_feedback_slot_(kInvalidFeedbackSlot) {
|
| + homeobject_feedback_slot_(FeedbackVectorSlot::Invalid()) {
|
| DCHECK(this_var->is_this());
|
| }
|
|
|
| VariableProxy* this_var_;
|
| - int homeobject_feedback_slot_;
|
| + FeedbackVectorSlot homeobject_feedback_slot_;
|
| };
|
|
|
|
|
| @@ -3084,7 +3074,8 @@ class AstConstructionVisitor BASE_EMBEDDED {
|
| void add_slot_node(AstNode* slot_node) {
|
| int count = slot_node->ComputeFeedbackSlotCount();
|
| if (count > 0) {
|
| - slot_node->SetFirstFeedbackSlot(properties_.feedback_slots());
|
| + slot_node->SetFirstFeedbackSlot(
|
| + FeedbackVectorSlot(properties_.feedback_slots()));
|
| properties_.increase_feedback_slots(count);
|
| }
|
| }
|
|
|