| 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 |
| 21 enum class FeedbackVectorSlotKind { |
| 22 UNUSED, |
| 23 CALL_IC, |
| 24 LOAD_IC, |
| 25 KEYED_LOAD_IC, |
| 26 STORE_IC, |
| 27 KEYED_STORE_IC, |
| 28 |
| 29 KINDS_NUMBER // Last value indicating number of kinds. |
| 30 }; |
| 31 |
| 32 |
| 33 std::ostream& operator<<(std::ostream& os, FeedbackVectorSlotKind kind); |
| 34 |
| 35 |
| 20 class FeedbackVectorSpec { | 36 class FeedbackVectorSpec { |
| 21 public: | 37 public: |
| 22 FeedbackVectorSpec() : slots_(0), ic_slots_(0), ic_kinds_(NULL) {} | 38 FeedbackVectorSpec() : slots_(0), ic_slots_(0), ic_kinds_(NULL) {} |
| 23 explicit FeedbackVectorSpec(int slots) | 39 explicit FeedbackVectorSpec(int slots) |
| 24 : slots_(slots), ic_slots_(0), ic_kinds_(NULL) {} | 40 : slots_(slots), ic_slots_(0), ic_kinds_(NULL) {} |
| 25 FeedbackVectorSpec(int slots, int ic_slots, Code::Kind* ic_slot_kinds) | 41 FeedbackVectorSpec(int slots, int ic_slots, |
| 42 FeedbackVectorSlotKind* ic_slot_kinds) |
| 26 : slots_(slots), ic_slots_(ic_slots), ic_kinds_(ic_slot_kinds) {} | 43 : slots_(slots), ic_slots_(ic_slots), ic_kinds_(ic_slot_kinds) {} |
| 27 | 44 |
| 28 int slots() const { return slots_; } | 45 int slots() const { return slots_; } |
| 29 | 46 |
| 30 int ic_slots() const { return ic_slots_; } | 47 int ic_slots() const { return ic_slots_; } |
| 31 | 48 |
| 32 Code::Kind GetKind(int ic_slot) const { | 49 FeedbackVectorSlotKind GetKind(int ic_slot) const { |
| 33 DCHECK(ic_slots_ > 0 && ic_slot < ic_slots_); | 50 DCHECK(ic_slots_ > 0 && ic_slot < ic_slots_); |
| 34 return ic_kinds_[ic_slot]; | 51 return ic_kinds_[ic_slot]; |
| 35 } | 52 } |
| 36 | 53 |
| 37 private: | 54 private: |
| 38 int slots_; | 55 int slots_; |
| 39 int ic_slots_; | 56 int ic_slots_; |
| 40 Code::Kind* ic_kinds_; | 57 FeedbackVectorSlotKind* ic_kinds_; |
| 41 }; | 58 }; |
| 42 | 59 |
| 43 | 60 |
| 44 class ZoneFeedbackVectorSpec { | 61 class ZoneFeedbackVectorSpec { |
| 45 public: | 62 public: |
| 46 explicit ZoneFeedbackVectorSpec(Zone* zone) | 63 explicit ZoneFeedbackVectorSpec(Zone* zone) |
| 47 : slots_(0), ic_slots_(0), ic_slot_kinds_(zone) {} | 64 : slots_(0), ic_slots_(0), ic_slot_kinds_(zone) {} |
| 48 | 65 |
| 49 ZoneFeedbackVectorSpec(Zone* zone, int slots, int ic_slots) | 66 ZoneFeedbackVectorSpec(Zone* zone, int slots, int ic_slots) |
| 50 : slots_(slots), ic_slots_(ic_slots), ic_slot_kinds_(ic_slots, zone) {} | 67 : slots_(slots), ic_slots_(ic_slots), ic_slot_kinds_(ic_slots, zone) {} |
| 51 | 68 |
| 52 int slots() const { return slots_; } | 69 int slots() const { return slots_; } |
| 53 void increase_slots(int count) { slots_ += count; } | 70 void increase_slots(int count) { slots_ += count; } |
| 54 | 71 |
| 55 int ic_slots() const { return ic_slots_; } | 72 int ic_slots() const { return ic_slots_; } |
| 56 void increase_ic_slots(int count) { | 73 void increase_ic_slots(int count) { |
| 57 ic_slots_ += count; | 74 ic_slots_ += count; |
| 58 ic_slot_kinds_.resize(ic_slots_); | 75 ic_slot_kinds_.resize(ic_slots_); |
| 59 } | 76 } |
| 60 | 77 |
| 61 void SetKind(int ic_slot, Code::Kind kind) { | 78 void SetKind(int ic_slot, FeedbackVectorSlotKind kind) { |
| 62 ic_slot_kinds_[ic_slot] = kind; | 79 ic_slot_kinds_[ic_slot] = static_cast<unsigned char>(kind); |
| 63 } | 80 } |
| 64 | 81 |
| 65 Code::Kind GetKind(int ic_slot) const { | 82 FeedbackVectorSlotKind GetKind(int ic_slot) const { |
| 66 return static_cast<Code::Kind>(ic_slot_kinds_.at(ic_slot)); | 83 return static_cast<FeedbackVectorSlotKind>(ic_slot_kinds_.at(ic_slot)); |
| 67 } | 84 } |
| 68 | 85 |
| 69 private: | 86 private: |
| 70 int slots_; | 87 int slots_; |
| 71 int ic_slots_; | 88 int ic_slots_; |
| 72 ZoneVector<unsigned char> ic_slot_kinds_; | 89 ZoneVector<unsigned char> ic_slot_kinds_; |
| 73 }; | 90 }; |
| 74 | 91 |
| 75 | 92 |
| 76 // The shape of the TypeFeedbackVector is an array with: | 93 // The shape of the TypeFeedbackVector is an array with: |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 118 inline FeedbackVectorSlot ToSlot(int index) const; | 135 inline FeedbackVectorSlot ToSlot(int index) const; |
| 119 inline FeedbackVectorICSlot ToICSlot(int index) const; | 136 inline FeedbackVectorICSlot ToICSlot(int index) const; |
| 120 inline Object* Get(FeedbackVectorSlot slot) const; | 137 inline Object* Get(FeedbackVectorSlot slot) const; |
| 121 inline void Set(FeedbackVectorSlot slot, Object* value, | 138 inline void Set(FeedbackVectorSlot slot, Object* value, |
| 122 WriteBarrierMode mode = UPDATE_WRITE_BARRIER); | 139 WriteBarrierMode mode = UPDATE_WRITE_BARRIER); |
| 123 inline Object* Get(FeedbackVectorICSlot slot) const; | 140 inline Object* Get(FeedbackVectorICSlot slot) const; |
| 124 inline void Set(FeedbackVectorICSlot slot, Object* value, | 141 inline void Set(FeedbackVectorICSlot slot, Object* value, |
| 125 WriteBarrierMode mode = UPDATE_WRITE_BARRIER); | 142 WriteBarrierMode mode = UPDATE_WRITE_BARRIER); |
| 126 | 143 |
| 127 // IC slots need metadata to recognize the type of IC. | 144 // IC slots need metadata to recognize the type of IC. |
| 128 Code::Kind GetKind(FeedbackVectorICSlot slot) const; | 145 FeedbackVectorSlotKind GetKind(FeedbackVectorICSlot slot) const; |
| 129 | 146 |
| 130 template <typename Spec> | 147 template <typename Spec> |
| 131 static Handle<TypeFeedbackVector> Allocate(Isolate* isolate, | 148 static Handle<TypeFeedbackVector> Allocate(Isolate* isolate, |
| 132 const Spec* spec); | 149 const Spec* spec); |
| 133 | 150 |
| 134 static Handle<TypeFeedbackVector> Copy(Isolate* isolate, | 151 static Handle<TypeFeedbackVector> Copy(Isolate* isolate, |
| 135 Handle<TypeFeedbackVector> vector); | 152 Handle<TypeFeedbackVector> vector); |
| 136 | 153 |
| 137 #ifdef OBJECT_PRINT | 154 #ifdef OBJECT_PRINT |
| 138 // For gdb debugging. | 155 // For gdb debugging. |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 178 static Handle<TypeFeedbackVector> DummyVector(Isolate* isolate); | 195 static Handle<TypeFeedbackVector> DummyVector(Isolate* isolate); |
| 179 static FeedbackVectorICSlot DummySlot(int dummyIndex) { | 196 static FeedbackVectorICSlot DummySlot(int dummyIndex) { |
| 180 DCHECK(dummyIndex >= 0 && dummyIndex <= kDummyKeyedStoreICSlot); | 197 DCHECK(dummyIndex >= 0 && dummyIndex <= kDummyKeyedStoreICSlot); |
| 181 return FeedbackVectorICSlot(dummyIndex); | 198 return FeedbackVectorICSlot(dummyIndex); |
| 182 } | 199 } |
| 183 | 200 |
| 184 static int PushAppliedArgumentsIndex(); | 201 static int PushAppliedArgumentsIndex(); |
| 185 static Handle<TypeFeedbackVector> CreatePushAppliedArgumentsVector( | 202 static Handle<TypeFeedbackVector> CreatePushAppliedArgumentsVector( |
| 186 Isolate* isolate); | 203 Isolate* isolate); |
| 187 | 204 |
| 205 static const char* Kind2String(FeedbackVectorSlotKind kind); |
| 206 |
| 188 private: | 207 private: |
| 189 enum VectorICKind { | 208 static const int kFeedbackVectorSlotKindBits = 3; |
| 190 KindUnused = 0x0, | 209 STATIC_ASSERT(static_cast<int>(FeedbackVectorSlotKind::KINDS_NUMBER) < |
| 191 KindCallIC = 0x1, | 210 (1 << kFeedbackVectorSlotKindBits)); |
| 192 KindLoadIC = 0x2, | |
| 193 KindKeyedLoadIC = 0x3, | |
| 194 KindStoreIC = 0x4, | |
| 195 KindKeyedStoreIC = 0x5, | |
| 196 }; | |
| 197 | 211 |
| 198 static const int kVectorICKindBits = 3; | 212 void SetKind(FeedbackVectorICSlot slot, FeedbackVectorSlotKind kind); |
| 199 static VectorICKind FromCodeKind(Code::Kind kind); | |
| 200 static Code::Kind FromVectorICKind(VectorICKind kind); | |
| 201 void SetKind(FeedbackVectorICSlot slot, Code::Kind kind); | |
| 202 | 213 |
| 203 typedef BitSetComputer<VectorICKind, kVectorICKindBits, kSmiValueSize, | 214 typedef BitSetComputer<FeedbackVectorSlotKind, kFeedbackVectorSlotKindBits, |
| 204 uint32_t> VectorICComputer; | 215 kSmiValueSize, uint32_t> VectorICComputer; |
| 205 | 216 |
| 206 void ClearSlotsImpl(SharedFunctionInfo* shared, bool force_clear); | 217 void ClearSlotsImpl(SharedFunctionInfo* shared, bool force_clear); |
| 207 void ClearICSlotsImpl(SharedFunctionInfo* shared, bool force_clear); | 218 void ClearICSlotsImpl(SharedFunctionInfo* shared, bool force_clear); |
| 208 | 219 |
| 209 DISALLOW_IMPLICIT_CONSTRUCTORS(TypeFeedbackVector); | 220 DISALLOW_IMPLICIT_CONSTRUCTORS(TypeFeedbackVector); |
| 210 }; | 221 }; |
| 211 | 222 |
| 212 | 223 |
| 213 // The following asserts protect an optimization in type feedback vector | 224 // The following asserts protect an optimization in type feedback vector |
| 214 // code that looks into the contents of a slot assuming to find a String, | 225 // code that looks into the contents of a slot assuming to find a String, |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 293 | 304 |
| 294 | 305 |
| 295 class CallICNexus : public FeedbackNexus { | 306 class CallICNexus : public FeedbackNexus { |
| 296 public: | 307 public: |
| 297 // Monomorphic call ics store call counts. Platform code needs to increment | 308 // Monomorphic call ics store call counts. Platform code needs to increment |
| 298 // the count appropriately (ie, by 2). | 309 // the count appropriately (ie, by 2). |
| 299 static const int kCallCountIncrement = 2; | 310 static const int kCallCountIncrement = 2; |
| 300 | 311 |
| 301 CallICNexus(Handle<TypeFeedbackVector> vector, FeedbackVectorICSlot slot) | 312 CallICNexus(Handle<TypeFeedbackVector> vector, FeedbackVectorICSlot slot) |
| 302 : FeedbackNexus(vector, slot) { | 313 : FeedbackNexus(vector, slot) { |
| 303 DCHECK(vector->GetKind(slot) == Code::CALL_IC); | 314 DCHECK_EQ(FeedbackVectorSlotKind::CALL_IC, vector->GetKind(slot)); |
| 304 } | 315 } |
| 305 CallICNexus(TypeFeedbackVector* vector, FeedbackVectorICSlot slot) | 316 CallICNexus(TypeFeedbackVector* vector, FeedbackVectorICSlot slot) |
| 306 : FeedbackNexus(vector, slot) { | 317 : FeedbackNexus(vector, slot) { |
| 307 DCHECK(vector->GetKind(slot) == Code::CALL_IC); | 318 DCHECK_EQ(FeedbackVectorSlotKind::CALL_IC, vector->GetKind(slot)); |
| 308 } | 319 } |
| 309 | 320 |
| 310 void Clear(Code* host); | 321 void Clear(Code* host); |
| 311 | 322 |
| 312 void ConfigureMonomorphicArray(); | 323 void ConfigureMonomorphicArray(); |
| 313 void ConfigureMonomorphic(Handle<JSFunction> function); | 324 void ConfigureMonomorphic(Handle<JSFunction> function); |
| 314 | 325 |
| 315 InlineCacheState StateFromFeedback() const override; | 326 InlineCacheState StateFromFeedback() const override; |
| 316 | 327 |
| 317 int ExtractMaps(MapHandleList* maps) const override { | 328 int ExtractMaps(MapHandleList* maps) const override { |
| 318 // CallICs don't record map feedback. | 329 // CallICs don't record map feedback. |
| 319 return 0; | 330 return 0; |
| 320 } | 331 } |
| 321 MaybeHandle<Code> FindHandlerForMap(Handle<Map> map) const override { | 332 MaybeHandle<Code> FindHandlerForMap(Handle<Map> map) const override { |
| 322 return MaybeHandle<Code>(); | 333 return MaybeHandle<Code>(); |
| 323 } | 334 } |
| 324 bool FindHandlers(CodeHandleList* code_list, int length = -1) const override { | 335 bool FindHandlers(CodeHandleList* code_list, int length = -1) const override { |
| 325 return length == 0; | 336 return length == 0; |
| 326 } | 337 } |
| 327 | 338 |
| 328 int ExtractCallCount(); | 339 int ExtractCallCount(); |
| 329 }; | 340 }; |
| 330 | 341 |
| 331 | 342 |
| 332 class LoadICNexus : public FeedbackNexus { | 343 class LoadICNexus : public FeedbackNexus { |
| 333 public: | 344 public: |
| 334 LoadICNexus(Handle<TypeFeedbackVector> vector, FeedbackVectorICSlot slot) | 345 LoadICNexus(Handle<TypeFeedbackVector> vector, FeedbackVectorICSlot slot) |
| 335 : FeedbackNexus(vector, slot) { | 346 : FeedbackNexus(vector, slot) { |
| 336 DCHECK(vector->GetKind(slot) == Code::LOAD_IC); | 347 DCHECK_EQ(FeedbackVectorSlotKind::LOAD_IC, vector->GetKind(slot)); |
| 337 } | 348 } |
| 338 explicit LoadICNexus(Isolate* isolate) | 349 explicit LoadICNexus(Isolate* isolate) |
| 339 : FeedbackNexus(TypeFeedbackVector::DummyVector(isolate), | 350 : FeedbackNexus(TypeFeedbackVector::DummyVector(isolate), |
| 340 TypeFeedbackVector::DummySlot( | 351 TypeFeedbackVector::DummySlot( |
| 341 TypeFeedbackVector::kDummyLoadICSlot)) {} | 352 TypeFeedbackVector::kDummyLoadICSlot)) {} |
| 342 LoadICNexus(TypeFeedbackVector* vector, FeedbackVectorICSlot slot) | 353 LoadICNexus(TypeFeedbackVector* vector, FeedbackVectorICSlot slot) |
| 343 : FeedbackNexus(vector, slot) { | 354 : FeedbackNexus(vector, slot) { |
| 344 DCHECK(vector->GetKind(slot) == Code::LOAD_IC); | 355 DCHECK_EQ(FeedbackVectorSlotKind::LOAD_IC, vector->GetKind(slot)); |
| 345 } | 356 } |
| 346 | 357 |
| 347 void Clear(Code* host); | 358 void Clear(Code* host); |
| 348 | 359 |
| 349 void ConfigureMonomorphic(Handle<Map> receiver_map, Handle<Code> handler); | 360 void ConfigureMonomorphic(Handle<Map> receiver_map, Handle<Code> handler); |
| 350 | 361 |
| 351 void ConfigurePolymorphic(MapHandleList* maps, CodeHandleList* handlers); | 362 void ConfigurePolymorphic(MapHandleList* maps, CodeHandleList* handlers); |
| 352 | 363 |
| 353 InlineCacheState StateFromFeedback() const override; | 364 InlineCacheState StateFromFeedback() const override; |
| 354 }; | 365 }; |
| 355 | 366 |
| 356 | 367 |
| 357 class KeyedLoadICNexus : public FeedbackNexus { | 368 class KeyedLoadICNexus : public FeedbackNexus { |
| 358 public: | 369 public: |
| 359 KeyedLoadICNexus(Handle<TypeFeedbackVector> vector, FeedbackVectorICSlot slot) | 370 KeyedLoadICNexus(Handle<TypeFeedbackVector> vector, FeedbackVectorICSlot slot) |
| 360 : FeedbackNexus(vector, slot) { | 371 : FeedbackNexus(vector, slot) { |
| 361 DCHECK(vector->GetKind(slot) == Code::KEYED_LOAD_IC); | 372 DCHECK_EQ(FeedbackVectorSlotKind::KEYED_LOAD_IC, vector->GetKind(slot)); |
| 362 } | 373 } |
| 363 KeyedLoadICNexus(TypeFeedbackVector* vector, FeedbackVectorICSlot slot) | 374 KeyedLoadICNexus(TypeFeedbackVector* vector, FeedbackVectorICSlot slot) |
| 364 : FeedbackNexus(vector, slot) { | 375 : FeedbackNexus(vector, slot) { |
| 365 DCHECK(vector->GetKind(slot) == Code::KEYED_LOAD_IC); | 376 DCHECK_EQ(FeedbackVectorSlotKind::KEYED_LOAD_IC, vector->GetKind(slot)); |
| 366 } | 377 } |
| 367 | 378 |
| 368 void Clear(Code* host); | 379 void Clear(Code* host); |
| 369 | 380 |
| 370 // name can be a null handle for element loads. | 381 // name can be a null handle for element loads. |
| 371 void ConfigureMonomorphic(Handle<Name> name, Handle<Map> receiver_map, | 382 void ConfigureMonomorphic(Handle<Name> name, Handle<Map> receiver_map, |
| 372 Handle<Code> handler); | 383 Handle<Code> handler); |
| 373 // name can be null. | 384 // name can be null. |
| 374 void ConfigurePolymorphic(Handle<Name> name, MapHandleList* maps, | 385 void ConfigurePolymorphic(Handle<Name> name, MapHandleList* maps, |
| 375 CodeHandleList* handlers); | 386 CodeHandleList* handlers); |
| 376 | 387 |
| 377 InlineCacheState StateFromFeedback() const override; | 388 InlineCacheState StateFromFeedback() const override; |
| 378 Name* FindFirstName() const override; | 389 Name* FindFirstName() const override; |
| 379 }; | 390 }; |
| 380 | 391 |
| 381 | 392 |
| 382 class StoreICNexus : public FeedbackNexus { | 393 class StoreICNexus : public FeedbackNexus { |
| 383 public: | 394 public: |
| 384 StoreICNexus(Handle<TypeFeedbackVector> vector, FeedbackVectorICSlot slot) | 395 StoreICNexus(Handle<TypeFeedbackVector> vector, FeedbackVectorICSlot slot) |
| 385 : FeedbackNexus(vector, slot) { | 396 : FeedbackNexus(vector, slot) { |
| 386 DCHECK(vector->GetKind(slot) == Code::STORE_IC); | 397 DCHECK_EQ(FeedbackVectorSlotKind::STORE_IC, vector->GetKind(slot)); |
| 387 } | 398 } |
| 388 explicit StoreICNexus(Isolate* isolate) | 399 explicit StoreICNexus(Isolate* isolate) |
| 389 : FeedbackNexus(TypeFeedbackVector::DummyVector(isolate), | 400 : FeedbackNexus(TypeFeedbackVector::DummyVector(isolate), |
| 390 TypeFeedbackVector::DummySlot( | 401 TypeFeedbackVector::DummySlot( |
| 391 TypeFeedbackVector::kDummyStoreICSlot)) {} | 402 TypeFeedbackVector::kDummyStoreICSlot)) {} |
| 392 StoreICNexus(TypeFeedbackVector* vector, FeedbackVectorICSlot slot) | 403 StoreICNexus(TypeFeedbackVector* vector, FeedbackVectorICSlot slot) |
| 393 : FeedbackNexus(vector, slot) { | 404 : FeedbackNexus(vector, slot) { |
| 394 DCHECK(vector->GetKind(slot) == Code::STORE_IC); | 405 DCHECK_EQ(FeedbackVectorSlotKind::STORE_IC, vector->GetKind(slot)); |
| 395 } | 406 } |
| 396 | 407 |
| 397 void Clear(Code* host); | 408 void Clear(Code* host); |
| 398 | 409 |
| 399 void ConfigureMonomorphic(Handle<Map> receiver_map, Handle<Code> handler); | 410 void ConfigureMonomorphic(Handle<Map> receiver_map, Handle<Code> handler); |
| 400 | 411 |
| 401 void ConfigurePolymorphic(MapHandleList* maps, CodeHandleList* handlers); | 412 void ConfigurePolymorphic(MapHandleList* maps, CodeHandleList* handlers); |
| 402 | 413 |
| 403 InlineCacheState StateFromFeedback() const override; | 414 InlineCacheState StateFromFeedback() const override; |
| 404 }; | 415 }; |
| 405 | 416 |
| 406 | 417 |
| 407 class KeyedStoreICNexus : public FeedbackNexus { | 418 class KeyedStoreICNexus : public FeedbackNexus { |
| 408 public: | 419 public: |
| 409 KeyedStoreICNexus(Handle<TypeFeedbackVector> vector, | 420 KeyedStoreICNexus(Handle<TypeFeedbackVector> vector, |
| 410 FeedbackVectorICSlot slot) | 421 FeedbackVectorICSlot slot) |
| 411 : FeedbackNexus(vector, slot) { | 422 : FeedbackNexus(vector, slot) { |
| 412 DCHECK(vector->GetKind(slot) == Code::KEYED_STORE_IC); | 423 DCHECK_EQ(FeedbackVectorSlotKind::KEYED_STORE_IC, vector->GetKind(slot)); |
| 413 } | 424 } |
| 414 explicit KeyedStoreICNexus(Isolate* isolate) | 425 explicit KeyedStoreICNexus(Isolate* isolate) |
| 415 : FeedbackNexus(TypeFeedbackVector::DummyVector(isolate), | 426 : FeedbackNexus(TypeFeedbackVector::DummyVector(isolate), |
| 416 TypeFeedbackVector::DummySlot( | 427 TypeFeedbackVector::DummySlot( |
| 417 TypeFeedbackVector::kDummyKeyedStoreICSlot)) {} | 428 TypeFeedbackVector::kDummyKeyedStoreICSlot)) {} |
| 418 KeyedStoreICNexus(TypeFeedbackVector* vector, FeedbackVectorICSlot slot) | 429 KeyedStoreICNexus(TypeFeedbackVector* vector, FeedbackVectorICSlot slot) |
| 419 : FeedbackNexus(vector, slot) { | 430 : FeedbackNexus(vector, slot) { |
| 420 DCHECK(vector->GetKind(slot) == Code::KEYED_STORE_IC); | 431 DCHECK_EQ(FeedbackVectorSlotKind::KEYED_STORE_IC, vector->GetKind(slot)); |
| 421 } | 432 } |
| 422 | 433 |
| 423 void Clear(Code* host); | 434 void Clear(Code* host); |
| 424 | 435 |
| 425 // name can be a null handle for element loads. | 436 // name can be a null handle for element loads. |
| 426 void ConfigureMonomorphic(Handle<Name> name, Handle<Map> receiver_map, | 437 void ConfigureMonomorphic(Handle<Name> name, Handle<Map> receiver_map, |
| 427 Handle<Code> handler); | 438 Handle<Code> handler); |
| 428 // name can be null. | 439 // name can be null. |
| 429 void ConfigurePolymorphic(Handle<Name> name, MapHandleList* maps, | 440 void ConfigurePolymorphic(Handle<Name> name, MapHandleList* maps, |
| 430 CodeHandleList* handlers); | 441 CodeHandleList* handlers); |
| 431 void ConfigurePolymorphic(MapHandleList* maps, | 442 void ConfigurePolymorphic(MapHandleList* maps, |
| 432 MapHandleList* transitioned_maps, | 443 MapHandleList* transitioned_maps, |
| 433 CodeHandleList* handlers); | 444 CodeHandleList* handlers); |
| 434 | 445 |
| 435 KeyedAccessStoreMode GetKeyedAccessStoreMode() const; | 446 KeyedAccessStoreMode GetKeyedAccessStoreMode() const; |
| 436 IcCheckType GetKeyType() const; | 447 IcCheckType GetKeyType() const; |
| 437 | 448 |
| 438 InlineCacheState StateFromFeedback() const override; | 449 InlineCacheState StateFromFeedback() const override; |
| 439 Name* FindFirstName() const override; | 450 Name* FindFirstName() const override; |
| 440 }; | 451 }; |
| 441 } | 452 } |
| 442 } // namespace v8::internal | 453 } // namespace v8::internal |
| 443 | 454 |
| 444 #endif // V8_TRANSITIONS_H_ | 455 #endif // V8_TRANSITIONS_H_ |
| OLD | NEW |