| OLD | NEW |
| 1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef V8_TYPE_FEEDBACK_VECTOR_H_ | 5 #ifndef V8_TYPE_FEEDBACK_VECTOR_H_ |
| 6 #define V8_TYPE_FEEDBACK_VECTOR_H_ | 6 #define V8_TYPE_FEEDBACK_VECTOR_H_ |
| 7 | 7 |
| 8 #include <vector> | 8 #include <vector> |
| 9 | 9 |
| 10 #include "src/base/logging.h" | 10 #include "src/base/logging.h" |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 46 inline FeedbackVectorSlot AddSlot(FeedbackVectorSlotKind kind); | 46 inline FeedbackVectorSlot AddSlot(FeedbackVectorSlotKind kind); |
| 47 | 47 |
| 48 FeedbackVectorSlot AddCallICSlot() { | 48 FeedbackVectorSlot AddCallICSlot() { |
| 49 return AddSlot(FeedbackVectorSlotKind::CALL_IC); | 49 return AddSlot(FeedbackVectorSlotKind::CALL_IC); |
| 50 } | 50 } |
| 51 | 51 |
| 52 FeedbackVectorSlot AddLoadICSlot() { | 52 FeedbackVectorSlot AddLoadICSlot() { |
| 53 return AddSlot(FeedbackVectorSlotKind::LOAD_IC); | 53 return AddSlot(FeedbackVectorSlotKind::LOAD_IC); |
| 54 } | 54 } |
| 55 | 55 |
| 56 FeedbackVectorSlot AddLoadGlobalICSlot(Handle<String> name) { | 56 FeedbackVectorSlot AddLoadGlobalICSlot() { |
| 57 This()->append_name(name); | |
| 58 return AddSlot(FeedbackVectorSlotKind::LOAD_GLOBAL_IC); | 57 return AddSlot(FeedbackVectorSlotKind::LOAD_GLOBAL_IC); |
| 59 } | 58 } |
| 60 | 59 |
| 61 FeedbackVectorSlot AddKeyedLoadICSlot() { | 60 FeedbackVectorSlot AddKeyedLoadICSlot() { |
| 62 return AddSlot(FeedbackVectorSlotKind::KEYED_LOAD_IC); | 61 return AddSlot(FeedbackVectorSlotKind::KEYED_LOAD_IC); |
| 63 } | 62 } |
| 64 | 63 |
| 65 FeedbackVectorSlot AddStoreICSlot() { | 64 FeedbackVectorSlot AddStoreICSlot() { |
| 66 return AddSlot(FeedbackVectorSlotKind::STORE_IC); | 65 return AddSlot(FeedbackVectorSlotKind::STORE_IC); |
| 67 } | 66 } |
| (...skipping 22 matching lines...) Expand all Loading... |
| 90 DECLARE_PRINTER(FeedbackVectorSpec) | 89 DECLARE_PRINTER(FeedbackVectorSpec) |
| 91 | 90 |
| 92 private: | 91 private: |
| 93 Derived* This() { return static_cast<Derived*>(this); } | 92 Derived* This() { return static_cast<Derived*>(this); } |
| 94 }; | 93 }; |
| 95 | 94 |
| 96 | 95 |
| 97 class StaticFeedbackVectorSpec | 96 class StaticFeedbackVectorSpec |
| 98 : public FeedbackVectorSpecBase<StaticFeedbackVectorSpec> { | 97 : public FeedbackVectorSpecBase<StaticFeedbackVectorSpec> { |
| 99 public: | 98 public: |
| 100 StaticFeedbackVectorSpec() : slot_count_(0), name_count_(0) {} | 99 StaticFeedbackVectorSpec() : slot_count_(0) {} |
| 101 | 100 |
| 102 int slots() const { return slot_count_; } | 101 int slots() const { return slot_count_; } |
| 103 | 102 |
| 104 FeedbackVectorSlotKind GetKind(int slot) const { | 103 FeedbackVectorSlotKind GetKind(int slot) const { |
| 105 DCHECK(slot >= 0 && slot < slot_count_); | 104 DCHECK(slot >= 0 && slot < slot_count_); |
| 106 return kinds_[slot]; | 105 return kinds_[slot]; |
| 107 } | 106 } |
| 108 | 107 |
| 109 int name_count() const { return name_count_; } | |
| 110 | |
| 111 Handle<String> GetName(int index) const { | |
| 112 DCHECK(index >= 0 && index < name_count_); | |
| 113 return names_[index]; | |
| 114 } | |
| 115 | |
| 116 private: | 108 private: |
| 117 friend class FeedbackVectorSpecBase<StaticFeedbackVectorSpec>; | 109 friend class FeedbackVectorSpecBase<StaticFeedbackVectorSpec>; |
| 118 | 110 |
| 119 void append(FeedbackVectorSlotKind kind) { | 111 void append(FeedbackVectorSlotKind kind) { |
| 120 DCHECK(slot_count_ < kMaxLength); | 112 DCHECK(slot_count_ < kMaxLength); |
| 121 kinds_[slot_count_++] = kind; | 113 kinds_[slot_count_++] = kind; |
| 122 } | 114 } |
| 123 | 115 |
| 124 void append_name(Handle<String> name) { | |
| 125 DCHECK(name_count_ < kMaxLength); | |
| 126 names_[name_count_++] = name; | |
| 127 } | |
| 128 | |
| 129 static const int kMaxLength = 12; | 116 static const int kMaxLength = 12; |
| 130 | 117 |
| 131 int slot_count_; | 118 int slot_count_; |
| 132 FeedbackVectorSlotKind kinds_[kMaxLength]; | 119 FeedbackVectorSlotKind kinds_[kMaxLength]; |
| 133 int name_count_; | |
| 134 Handle<String> names_[kMaxLength]; | |
| 135 }; | 120 }; |
| 136 | 121 |
| 137 | 122 |
| 138 class FeedbackVectorSpec : public FeedbackVectorSpecBase<FeedbackVectorSpec> { | 123 class FeedbackVectorSpec : public FeedbackVectorSpecBase<FeedbackVectorSpec> { |
| 139 public: | 124 public: |
| 140 explicit FeedbackVectorSpec(Zone* zone) : slot_kinds_(zone), names_(zone) { | 125 explicit FeedbackVectorSpec(Zone* zone) : slot_kinds_(zone) { |
| 141 slot_kinds_.reserve(16); | 126 slot_kinds_.reserve(16); |
| 142 names_.reserve(8); | |
| 143 } | 127 } |
| 144 | 128 |
| 145 int slots() const { return static_cast<int>(slot_kinds_.size()); } | 129 int slots() const { return static_cast<int>(slot_kinds_.size()); } |
| 146 | 130 |
| 147 FeedbackVectorSlotKind GetKind(int slot) const { | 131 FeedbackVectorSlotKind GetKind(int slot) const { |
| 148 return static_cast<FeedbackVectorSlotKind>(slot_kinds_.at(slot)); | 132 return static_cast<FeedbackVectorSlotKind>(slot_kinds_.at(slot)); |
| 149 } | 133 } |
| 150 | 134 |
| 151 int name_count() const { return static_cast<int>(names_.size()); } | |
| 152 | |
| 153 Handle<String> GetName(int index) const { return names_.at(index); } | |
| 154 | |
| 155 private: | 135 private: |
| 156 friend class FeedbackVectorSpecBase<FeedbackVectorSpec>; | 136 friend class FeedbackVectorSpecBase<FeedbackVectorSpec>; |
| 157 | 137 |
| 158 void append(FeedbackVectorSlotKind kind) { | 138 void append(FeedbackVectorSlotKind kind) { |
| 159 slot_kinds_.push_back(static_cast<unsigned char>(kind)); | 139 slot_kinds_.push_back(static_cast<unsigned char>(kind)); |
| 160 } | 140 } |
| 161 | 141 |
| 162 void append_name(Handle<String> name) { names_.push_back(name); } | |
| 163 | |
| 164 ZoneVector<unsigned char> slot_kinds_; | 142 ZoneVector<unsigned char> slot_kinds_; |
| 165 ZoneVector<Handle<String>> names_; | |
| 166 }; | 143 }; |
| 167 | 144 |
| 168 | 145 |
| 169 // The shape of the TypeFeedbackMetadata is an array with: | 146 // The shape of the TypeFeedbackMetadata is an array with: |
| 170 // 0: slot_count | 147 // 0: slot_count |
| 171 // 1: names table | 148 // 1: names table |
| 172 // 2..N: slot kinds packed into a bit vector | 149 // 2..N: slot kinds packed into a bit vector |
| 173 // | 150 // |
| 174 class TypeFeedbackMetadata : public FixedArray { | 151 class TypeFeedbackMetadata : public FixedArray { |
| 175 public: | 152 public: |
| 176 // Casting. | 153 // Casting. |
| 177 static inline TypeFeedbackMetadata* cast(Object* obj); | 154 static inline TypeFeedbackMetadata* cast(Object* obj); |
| 178 | 155 |
| 179 static const int kSlotsCountIndex = 0; | 156 static const int kSlotsCountIndex = 0; |
| 180 static const int kNamesTableIndex = 1; | 157 static const int kReservedIndexCount = 1; |
| 181 static const int kReservedIndexCount = 2; | |
| 182 | 158 |
| 183 static const int kNameTableEntrySize = 2; | 159 static const int kNameTableEntrySize = 2; |
| 184 static const int kNameTableSlotIndex = 0; | 160 static const int kNameTableSlotIndex = 0; |
| 185 static const int kNameTableNameIndex = 1; | 161 static const int kNameTableNameIndex = 1; |
| 186 | 162 |
| 187 // Returns number of feedback vector elements used by given slot kind. | 163 // Returns number of feedback vector elements used by given slot kind. |
| 188 static inline int GetSlotSize(FeedbackVectorSlotKind kind); | 164 static inline int GetSlotSize(FeedbackVectorSlotKind kind); |
| 189 | 165 |
| 190 // Defines if slots of given kind require "name". | |
| 191 static inline bool SlotRequiresName(FeedbackVectorSlotKind kind); | |
| 192 | |
| 193 bool SpecDiffersFrom(const FeedbackVectorSpec* other_spec) const; | 166 bool SpecDiffersFrom(const FeedbackVectorSpec* other_spec) const; |
| 194 | 167 |
| 195 bool DiffersFrom(const TypeFeedbackMetadata* other_metadata) const; | 168 bool DiffersFrom(const TypeFeedbackMetadata* other_metadata) const; |
| 196 | 169 |
| 197 inline bool is_empty() const; | 170 inline bool is_empty() const; |
| 198 | 171 |
| 199 // Returns number of slots in the vector. | 172 // Returns number of slots in the vector. |
| 200 inline int slot_count() const; | 173 inline int slot_count() const; |
| 201 | 174 |
| 202 // Returns slot kind for given slot. | 175 // Returns slot kind for given slot. |
| 203 FeedbackVectorSlotKind GetKind(FeedbackVectorSlot slot) const; | 176 FeedbackVectorSlotKind GetKind(FeedbackVectorSlot slot) const; |
| 204 | 177 |
| 205 // Returns name for given slot. | |
| 206 String* GetName(FeedbackVectorSlot slot) const; | |
| 207 | |
| 208 template <typename Spec> | 178 template <typename Spec> |
| 209 static Handle<TypeFeedbackMetadata> New(Isolate* isolate, const Spec* spec); | 179 static Handle<TypeFeedbackMetadata> New(Isolate* isolate, const Spec* spec); |
| 210 | 180 |
| 211 #ifdef OBJECT_PRINT | 181 #ifdef OBJECT_PRINT |
| 212 // For gdb debugging. | 182 // For gdb debugging. |
| 213 void Print(); | 183 void Print(); |
| 214 #endif // OBJECT_PRINT | 184 #endif // OBJECT_PRINT |
| 215 | 185 |
| 216 DECLARE_PRINTER(TypeFeedbackMetadata) | 186 DECLARE_PRINTER(TypeFeedbackMetadata) |
| 217 | 187 |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 266 FeedbackVectorSlot slot); | 236 FeedbackVectorSlot slot); |
| 267 | 237 |
| 268 // Conversion from an integer index to the underlying array to a slot. | 238 // Conversion from an integer index to the underlying array to a slot. |
| 269 static inline FeedbackVectorSlot ToSlot(int index); | 239 static inline FeedbackVectorSlot ToSlot(int index); |
| 270 inline Object* Get(FeedbackVectorSlot slot) const; | 240 inline Object* Get(FeedbackVectorSlot slot) const; |
| 271 inline void Set(FeedbackVectorSlot slot, Object* value, | 241 inline void Set(FeedbackVectorSlot slot, Object* value, |
| 272 WriteBarrierMode mode = UPDATE_WRITE_BARRIER); | 242 WriteBarrierMode mode = UPDATE_WRITE_BARRIER); |
| 273 | 243 |
| 274 // Returns slot kind for given slot. | 244 // Returns slot kind for given slot. |
| 275 FeedbackVectorSlotKind GetKind(FeedbackVectorSlot slot) const; | 245 FeedbackVectorSlotKind GetKind(FeedbackVectorSlot slot) const; |
| 276 // Returns name corresponding to given slot or an empty string. | |
| 277 String* GetName(FeedbackVectorSlot slot) const; | |
| 278 | 246 |
| 279 static Handle<TypeFeedbackVector> New(Isolate* isolate, | 247 static Handle<TypeFeedbackVector> New(Isolate* isolate, |
| 280 Handle<TypeFeedbackMetadata> metadata); | 248 Handle<TypeFeedbackMetadata> metadata); |
| 281 | 249 |
| 282 static Handle<TypeFeedbackVector> Copy(Isolate* isolate, | 250 static Handle<TypeFeedbackVector> Copy(Isolate* isolate, |
| 283 Handle<TypeFeedbackVector> vector); | 251 Handle<TypeFeedbackVector> vector); |
| 284 | 252 |
| 285 #ifdef OBJECT_PRINT | 253 #ifdef OBJECT_PRINT |
| 286 // For gdb debugging. | 254 // For gdb debugging. |
| 287 void Print(); | 255 void Print(); |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 364 // Returns slot kind of the last slot returned by Next(). | 332 // Returns slot kind of the last slot returned by Next(). |
| 365 FeedbackVectorSlotKind kind() const { | 333 FeedbackVectorSlotKind kind() const { |
| 366 DCHECK_NE(FeedbackVectorSlotKind::INVALID, slot_kind_); | 334 DCHECK_NE(FeedbackVectorSlotKind::INVALID, slot_kind_); |
| 367 DCHECK_NE(FeedbackVectorSlotKind::KINDS_NUMBER, slot_kind_); | 335 DCHECK_NE(FeedbackVectorSlotKind::KINDS_NUMBER, slot_kind_); |
| 368 return slot_kind_; | 336 return slot_kind_; |
| 369 } | 337 } |
| 370 | 338 |
| 371 // Returns entry size of the last slot returned by Next(). | 339 // Returns entry size of the last slot returned by Next(). |
| 372 inline int entry_size() const; | 340 inline int entry_size() const; |
| 373 | 341 |
| 374 String* name() const { | |
| 375 DCHECK(TypeFeedbackMetadata::SlotRequiresName(kind())); | |
| 376 return metadata()->GetName(cur_slot_); | |
| 377 } | |
| 378 | |
| 379 private: | 342 private: |
| 380 TypeFeedbackMetadata* metadata() const { | 343 TypeFeedbackMetadata* metadata() const { |
| 381 return !metadata_handle_.is_null() ? *metadata_handle_ : metadata_; | 344 return !metadata_handle_.is_null() ? *metadata_handle_ : metadata_; |
| 382 } | 345 } |
| 383 | 346 |
| 384 // The reason for having a handle and a raw pointer to the meta data is | 347 // The reason for having a handle and a raw pointer to the meta data is |
| 385 // to have a single iterator implementation for both "handlified" and raw | 348 // to have a single iterator implementation for both "handlified" and raw |
| 386 // pointer use cases. | 349 // pointer use cases. |
| 387 Handle<TypeFeedbackMetadata> metadata_handle_; | 350 Handle<TypeFeedbackMetadata> metadata_handle_; |
| 388 TypeFeedbackMetadata* metadata_; | 351 TypeFeedbackMetadata* metadata_; |
| (...skipping 326 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 715 } | 678 } |
| 716 }; | 679 }; |
| 717 | 680 |
| 718 inline BinaryOperationHint BinaryOperationHintFromFeedback(int type_feedback); | 681 inline BinaryOperationHint BinaryOperationHintFromFeedback(int type_feedback); |
| 719 inline CompareOperationHint CompareOperationHintFromFeedback(int type_feedback); | 682 inline CompareOperationHint CompareOperationHintFromFeedback(int type_feedback); |
| 720 | 683 |
| 721 } // namespace internal | 684 } // namespace internal |
| 722 } // namespace v8 | 685 } // namespace v8 |
| 723 | 686 |
| 724 #endif // V8_TRANSITIONS_H_ | 687 #endif // V8_TRANSITIONS_H_ |
| OLD | NEW |