| 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/checks.h" | 10 #include "src/checks.h" |
| 11 #include "src/elements-kind.h" | 11 #include "src/elements-kind.h" |
| 12 #include "src/heap/heap.h" | 12 #include "src/heap/heap.h" |
| 13 #include "src/isolate.h" | 13 #include "src/isolate.h" |
| 14 #include "src/objects.h" | 14 #include "src/objects.h" |
| 15 #include "src/zone-containers.h" | 15 #include "src/zone-containers.h" |
| 16 | 16 |
| 17 namespace v8 { | 17 namespace v8 { |
| 18 namespace internal { | 18 namespace internal { |
| 19 | 19 |
| 20 class FeedbackVectorSpec { | 20 class FeedbackVectorSpec { |
| 21 public: | 21 public: |
| 22 FeedbackVectorSpec() : slots_(0), has_ic_slot_(false) {} | 22 FeedbackVectorSpec() : slots_(0), ic_slots_(0), ic_kinds_(NULL) {} |
| 23 explicit FeedbackVectorSpec(int slots) : slots_(slots), has_ic_slot_(false) {} | 23 explicit FeedbackVectorSpec(int slots) |
| 24 FeedbackVectorSpec(int slots, Code::Kind ic_slot_kind) | 24 : slots_(slots), ic_slots_(0), ic_kinds_(NULL) {} |
| 25 : slots_(slots), has_ic_slot_(true), ic_kind_(ic_slot_kind) {} | 25 FeedbackVectorSpec(int slots, int ic_slots, Code::Kind* ic_slot_kinds) |
| 26 : slots_(slots), ic_slots_(ic_slots), ic_kinds_(ic_slot_kinds) {} |
| 26 | 27 |
| 27 int slots() const { return slots_; } | 28 int slots() const { return slots_; } |
| 28 | 29 |
| 29 int ic_slots() const { return has_ic_slot_ ? 1 : 0; } | 30 int ic_slots() const { return ic_slots_; } |
| 30 | 31 |
| 31 Code::Kind GetKind(int ic_slot) const { | 32 Code::Kind GetKind(int ic_slot) const { |
| 32 DCHECK(has_ic_slot_ && ic_slot == 0); | 33 DCHECK(ic_slots_ > 0 && ic_slot < ic_slots_); |
| 33 return ic_kind_; | 34 return ic_kinds_[ic_slot]; |
| 34 } | 35 } |
| 35 | 36 |
| 36 private: | 37 private: |
| 37 int slots_; | 38 int slots_; |
| 38 bool has_ic_slot_; | 39 int ic_slots_; |
| 39 Code::Kind ic_kind_; | 40 Code::Kind* ic_kinds_; |
| 40 }; | 41 }; |
| 41 | 42 |
| 42 | 43 |
| 43 class ZoneFeedbackVectorSpec { | 44 class ZoneFeedbackVectorSpec { |
| 44 public: | 45 public: |
| 45 explicit ZoneFeedbackVectorSpec(Zone* zone) | 46 explicit ZoneFeedbackVectorSpec(Zone* zone) |
| 46 : slots_(0), ic_slots_(0), ic_slot_kinds_(zone) {} | 47 : slots_(0), ic_slots_(0), ic_slot_kinds_(zone) {} |
| 47 | 48 |
| 48 ZoneFeedbackVectorSpec(Zone* zone, int slots, int ic_slots) | 49 ZoneFeedbackVectorSpec(Zone* zone, int slots, int ic_slots) |
| 49 : slots_(slots), ic_slots_(ic_slots), ic_slot_kinds_(ic_slots, zone) {} | 50 : slots_(slots), ic_slots_(ic_slots), ic_slot_kinds_(ic_slots, zone) {} |
| (...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 218 // The object that indicates a megamorphic state. | 219 // The object that indicates a megamorphic state. |
| 219 static inline Handle<Object> MegamorphicSentinel(Isolate* isolate); | 220 static inline Handle<Object> MegamorphicSentinel(Isolate* isolate); |
| 220 | 221 |
| 221 // The object that indicates a premonomorphic state. | 222 // The object that indicates a premonomorphic state. |
| 222 static inline Handle<Object> PremonomorphicSentinel(Isolate* isolate); | 223 static inline Handle<Object> PremonomorphicSentinel(Isolate* isolate); |
| 223 | 224 |
| 224 // A raw version of the uninitialized sentinel that's safe to read during | 225 // A raw version of the uninitialized sentinel that's safe to read during |
| 225 // garbage collection (e.g., for patching the cache). | 226 // garbage collection (e.g., for patching the cache). |
| 226 static inline Object* RawUninitializedSentinel(Heap* heap); | 227 static inline Object* RawUninitializedSentinel(Heap* heap); |
| 227 | 228 |
| 229 static const int kDummyLoadICSlot = 0; |
| 230 static const int kDummyKeyedLoadICSlot = 1; |
| 231 static const int kDummyStoreICSlot = 2; |
| 232 static const int kDummyKeyedStoreICSlot = 3; |
| 233 |
| 234 static Handle<TypeFeedbackVector> DummyVector(Isolate* isolate); |
| 235 static FeedbackVectorICSlot DummySlot(int dummyIndex) { |
| 236 DCHECK(dummyIndex >= 0 && dummyIndex <= kDummyKeyedStoreICSlot); |
| 237 return FeedbackVectorICSlot(dummyIndex); |
| 238 } |
| 239 |
| 228 private: | 240 private: |
| 229 enum VectorICKind { | 241 enum VectorICKind { |
| 230 KindUnused = 0x0, | 242 KindUnused = 0x0, |
| 231 KindCallIC = 0x1, | 243 KindCallIC = 0x1, |
| 232 KindLoadIC = 0x2, | 244 KindLoadIC = 0x2, |
| 233 KindKeyedLoadIC = 0x3, | 245 KindKeyedLoadIC = 0x3, |
| 234 KindStoreIC = 0x4, | 246 KindStoreIC = 0x4, |
| 235 KindKeyedStoreIC = 0x5, | 247 KindKeyedStoreIC = 0x5, |
| 236 }; | 248 }; |
| 237 | 249 |
| (...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 379 int ExtractCallCount(); | 391 int ExtractCallCount(); |
| 380 }; | 392 }; |
| 381 | 393 |
| 382 | 394 |
| 383 class LoadICNexus : public FeedbackNexus { | 395 class LoadICNexus : public FeedbackNexus { |
| 384 public: | 396 public: |
| 385 LoadICNexus(Handle<TypeFeedbackVector> vector, FeedbackVectorICSlot slot) | 397 LoadICNexus(Handle<TypeFeedbackVector> vector, FeedbackVectorICSlot slot) |
| 386 : FeedbackNexus(vector, slot) { | 398 : FeedbackNexus(vector, slot) { |
| 387 DCHECK(vector->GetKind(slot) == Code::LOAD_IC); | 399 DCHECK(vector->GetKind(slot) == Code::LOAD_IC); |
| 388 } | 400 } |
| 401 explicit LoadICNexus(Isolate* isolate) |
| 402 : FeedbackNexus(TypeFeedbackVector::DummyVector(isolate), |
| 403 TypeFeedbackVector::DummySlot( |
| 404 TypeFeedbackVector::kDummyLoadICSlot)) {} |
| 389 LoadICNexus(TypeFeedbackVector* vector, FeedbackVectorICSlot slot) | 405 LoadICNexus(TypeFeedbackVector* vector, FeedbackVectorICSlot slot) |
| 390 : FeedbackNexus(vector, slot) { | 406 : FeedbackNexus(vector, slot) { |
| 391 DCHECK(vector->GetKind(slot) == Code::LOAD_IC); | 407 DCHECK(vector->GetKind(slot) == Code::LOAD_IC); |
| 392 } | 408 } |
| 393 | 409 |
| 394 void Clear(Code* host); | 410 void Clear(Code* host); |
| 395 | 411 |
| 396 void ConfigureMonomorphic(Handle<Map> receiver_map, Handle<Code> handler); | 412 void ConfigureMonomorphic(Handle<Map> receiver_map, Handle<Code> handler); |
| 397 | 413 |
| 398 void ConfigurePolymorphic(MapHandleList* maps, CodeHandleList* handlers); | 414 void ConfigurePolymorphic(MapHandleList* maps, CodeHandleList* handlers); |
| (...skipping 26 matching lines...) Expand all Loading... |
| 425 Name* FindFirstName() const override; | 441 Name* FindFirstName() const override; |
| 426 }; | 442 }; |
| 427 | 443 |
| 428 | 444 |
| 429 class StoreICNexus : public FeedbackNexus { | 445 class StoreICNexus : public FeedbackNexus { |
| 430 public: | 446 public: |
| 431 StoreICNexus(Handle<TypeFeedbackVector> vector, FeedbackVectorICSlot slot) | 447 StoreICNexus(Handle<TypeFeedbackVector> vector, FeedbackVectorICSlot slot) |
| 432 : FeedbackNexus(vector, slot) { | 448 : FeedbackNexus(vector, slot) { |
| 433 DCHECK(vector->GetKind(slot) == Code::STORE_IC); | 449 DCHECK(vector->GetKind(slot) == Code::STORE_IC); |
| 434 } | 450 } |
| 451 explicit StoreICNexus(Isolate* isolate) |
| 452 : FeedbackNexus(TypeFeedbackVector::DummyVector(isolate), |
| 453 TypeFeedbackVector::DummySlot( |
| 454 TypeFeedbackVector::kDummyStoreICSlot)) {} |
| 435 StoreICNexus(TypeFeedbackVector* vector, FeedbackVectorICSlot slot) | 455 StoreICNexus(TypeFeedbackVector* vector, FeedbackVectorICSlot slot) |
| 436 : FeedbackNexus(vector, slot) { | 456 : FeedbackNexus(vector, slot) { |
| 437 DCHECK(vector->GetKind(slot) == Code::STORE_IC); | 457 DCHECK(vector->GetKind(slot) == Code::STORE_IC); |
| 438 } | 458 } |
| 439 | 459 |
| 440 void Clear(Code* host); | 460 void Clear(Code* host); |
| 441 | 461 |
| 442 void ConfigureMonomorphic(Handle<Map> receiver_map, Handle<Code> handler); | 462 void ConfigureMonomorphic(Handle<Map> receiver_map, Handle<Code> handler); |
| 443 | 463 |
| 444 void ConfigurePolymorphic(MapHandleList* maps, CodeHandleList* handlers); | 464 void ConfigurePolymorphic(MapHandleList* maps, CodeHandleList* handlers); |
| (...skipping 23 matching lines...) Expand all Loading... |
| 468 void ConfigurePolymorphic(Handle<Name> name, MapHandleList* maps, | 488 void ConfigurePolymorphic(Handle<Name> name, MapHandleList* maps, |
| 469 CodeHandleList* handlers); | 489 CodeHandleList* handlers); |
| 470 | 490 |
| 471 InlineCacheState StateFromFeedback() const override; | 491 InlineCacheState StateFromFeedback() const override; |
| 472 Name* FindFirstName() const override; | 492 Name* FindFirstName() const override; |
| 473 }; | 493 }; |
| 474 } | 494 } |
| 475 } // namespace v8::internal | 495 } // namespace v8::internal |
| 476 | 496 |
| 477 #endif // V8_TRANSITIONS_H_ | 497 #endif // V8_TRANSITIONS_H_ |
| OLD | NEW |