Chromium Code Reviews| Index: src/type-feedback-vector.h |
| diff --git a/src/type-feedback-vector.h b/src/type-feedback-vector.h |
| index 0c741a37bba9c17d65889f4d5459823ea3fba47a..a71e978ba9117798e5d5a0c32fa9ece7023e407f 100644 |
| --- a/src/type-feedback-vector.h |
| +++ b/src/type-feedback-vector.h |
| @@ -31,6 +31,8 @@ enum class FeedbackVectorSlotKind { |
| INTERPRETER_BINARYOP_IC, |
| INTERPRETER_COMPARE_IC, |
| + // This kind of slot has an integer parameter associated with it. |
| + CREATE_CLOSURE, |
| // This is a general purpose slot that occupies one feedback vector element. |
| GENERAL, |
| @@ -57,6 +59,11 @@ class FeedbackVectorSpecBase { |
| return AddSlot(FeedbackVectorSlotKind::LOAD_GLOBAL_IC); |
| } |
| + FeedbackVectorSlot AddCreateClosureSlot(int size) { |
| + This()->append_parameter(size); |
|
Benedikt Meurer
2016/12/11 17:58:09
This parameter business looks a bit complicated fo
mvstanton
2016/12/21 13:09:14
Good point. However just this change (rooting the
|
| + return AddSlot(FeedbackVectorSlotKind::CREATE_CLOSURE); |
| + } |
| + |
| FeedbackVectorSlot AddKeyedLoadICSlot() { |
| return AddSlot(FeedbackVectorSlotKind::KEYED_LOAD_IC); |
| } |
| @@ -96,7 +103,7 @@ class FeedbackVectorSpecBase { |
| class StaticFeedbackVectorSpec |
| : public FeedbackVectorSpecBase<StaticFeedbackVectorSpec> { |
| public: |
| - StaticFeedbackVectorSpec() : slot_count_(0) {} |
| + StaticFeedbackVectorSpec() : slot_count_(0), parameters_count_(0) {} |
| int slots() const { return slot_count_; } |
| @@ -105,6 +112,13 @@ class StaticFeedbackVectorSpec |
| return kinds_[slot]; |
| } |
| + int parameters_count() const { return parameters_count_; } |
| + |
| + int GetParameter(int index) const { |
| + DCHECK(index >= 0 && index < parameters_count_); |
| + return parameters_[index]; |
| + } |
| + |
| private: |
| friend class FeedbackVectorSpecBase<StaticFeedbackVectorSpec>; |
| @@ -113,17 +127,26 @@ class StaticFeedbackVectorSpec |
| kinds_[slot_count_++] = kind; |
| } |
| + void append_parameter(int parameter) { |
| + DCHECK(parameters_count_ < kMaxLength); |
| + parameters_[parameters_count_++] = parameter; |
| + } |
| + |
| static const int kMaxLength = 12; |
| int slot_count_; |
| FeedbackVectorSlotKind kinds_[kMaxLength]; |
| + int parameters_count_; |
| + int parameters_[kMaxLength]; |
| }; |
| class FeedbackVectorSpec : public FeedbackVectorSpecBase<FeedbackVectorSpec> { |
| public: |
| - explicit FeedbackVectorSpec(Zone* zone) : slot_kinds_(zone) { |
| + explicit FeedbackVectorSpec(Zone* zone) |
| + : slot_kinds_(zone), parameters_(zone) { |
| slot_kinds_.reserve(16); |
| + parameters_.reserve(8); |
| } |
| int slots() const { return static_cast<int>(slot_kinds_.size()); } |
| @@ -132,6 +155,10 @@ class FeedbackVectorSpec : public FeedbackVectorSpecBase<FeedbackVectorSpec> { |
| return static_cast<FeedbackVectorSlotKind>(slot_kinds_.at(slot)); |
| } |
| + int parameters_count() const { return static_cast<int>(parameters_.size()); } |
| + |
| + int GetParameter(int index) const { return parameters_.at(index); } |
| + |
| private: |
| friend class FeedbackVectorSpecBase<FeedbackVectorSpec>; |
| @@ -139,14 +166,18 @@ class FeedbackVectorSpec : public FeedbackVectorSpecBase<FeedbackVectorSpec> { |
| slot_kinds_.push_back(static_cast<unsigned char>(kind)); |
| } |
| + void append_parameter(int parameter) { parameters_.push_back(parameter); } |
| + |
| ZoneVector<unsigned char> slot_kinds_; |
| + ZoneVector<int> parameters_; |
| }; |
| // The shape of the TypeFeedbackMetadata is an array with: |
| // 0: slot_count |
| // 1: names table |
| -// 2..N: slot kinds packed into a bit vector |
| +// 2: parameters table |
| +// 3..N: slot kinds packed into a bit vector |
| // |
| class TypeFeedbackMetadata : public FixedArray { |
| public: |
| @@ -154,11 +185,15 @@ class TypeFeedbackMetadata : public FixedArray { |
| static inline TypeFeedbackMetadata* cast(Object* obj); |
| static const int kSlotsCountIndex = 0; |
| - static const int kReservedIndexCount = 1; |
| + static const int kParametersTableIndex = 1; |
| + static const int kReservedIndexCount = 2; |
| // Returns number of feedback vector elements used by given slot kind. |
| static inline int GetSlotSize(FeedbackVectorSlotKind kind); |
| + // Defines if slots of given kind require "parameter". |
| + static inline bool SlotRequiresParameter(FeedbackVectorSlotKind kind); |
| + |
| bool SpecDiffersFrom(const FeedbackVectorSpec* other_spec) const; |
| bool DiffersFrom(const TypeFeedbackMetadata* other_metadata) const; |
| @@ -171,6 +206,9 @@ class TypeFeedbackMetadata : public FixedArray { |
| // Returns slot kind for given slot. |
| FeedbackVectorSlotKind GetKind(FeedbackVectorSlot slot) const; |
| + // Returns parameter for given index (note: this is not the slot) |
| + int GetParameter(int parameter_index) const; |
| + |
| template <typename Spec> |
| static Handle<TypeFeedbackMetadata> New(Isolate* isolate, const Spec* spec); |
| @@ -239,6 +277,8 @@ class TypeFeedbackVector : public FixedArray { |
| // Returns slot kind for given slot. |
| FeedbackVectorSlotKind GetKind(FeedbackVectorSlot slot) const; |
| + // Returns parameter corresponding to given slot or -1. |
| + int GetParameter(FeedbackVectorSlot slot) const; |
| static Handle<TypeFeedbackVector> New(Isolate* isolate, |
| Handle<TypeFeedbackMetadata> metadata); |