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 |