28 void GenerateLoadIC();
29 void GenerateLoadIC_Megamorphic();
30 void GenerateLoadIC_Noninlined();
31 void GenerateLoadIC_NoFeedback();
32 void GenerateLoadGlobalIC_NoFeedback();
33 void GenerateLoadICTrampoline();
34 void GenerateLoadICBaseline();
35 void GenerateLoadICTrampoline_Megamorphic();
36 void GenerateLoadSuperIC();
37 void GenerateLoadSuperICBaseline();
38 void GenerateKeyedLoadIC();
39 void GenerateEnumeratedKeyedLoadIC();
40 void GenerateKeyedLoadIC_Megamorphic();
41 void GenerateKeyedLoadIC_PolymorphicName();
42 void GenerateKeyedLoadICTrampoline();
43 void GenerateKeyedLoadICBaseline();
44 void GenerateEnumeratedKeyedLoadICBaseline();
45 void GenerateKeyedLoadICTrampoline_Megamorphic();
46 void GenerateStoreIC();
47 void GenerateStoreIC_Megamorphic();
48 void GenerateStoreICTrampoline();
49 void GenerateStoreICTrampoline_Megamorphic();
50 void GenerateStoreICBaseline();
51 void GenerateDefineNamedOwnIC();
52 void GenerateDefineNamedOwnICTrampoline();
53 void GenerateDefineNamedOwnICBaseline();
54 void GenerateStoreGlobalIC();
55 void GenerateStoreGlobalICTrampoline();
56 void GenerateStoreGlobalICBaseline();
57 void GenerateCloneObjectIC();
58 void GenerateCloneObjectICBaseline();
59 void GenerateCloneObjectIC_Slow();
60 void GenerateKeyedHasIC();
61 void GenerateKeyedHasICBaseline();
62 void GenerateKeyedHasIC_Megamorphic();
63 void GenerateKeyedHasIC_PolymorphicName();
65 void GenerateLoadGlobalIC(
TypeofMode typeof_mode);
66 void GenerateLoadGlobalICTrampoline(
TypeofMode typeof_mode);
67 void GenerateLoadGlobalICBaseline(
TypeofMode typeof_mode);
68 void GenerateLookupGlobalIC(
TypeofMode typeof_mode);
69 void GenerateLookupGlobalICTrampoline(
TypeofMode typeof_mode);
70 void GenerateLookupGlobalICBaseline(
TypeofMode typeof_mode);
71 void GenerateLookupContextTrampoline(
TypeofMode typeof_mode,
73 void GenerateLookupContextBaseline(
TypeofMode typeof_mode,
76 void GenerateKeyedStoreIC();
77 void GenerateKeyedStoreICTrampoline();
78 void GenerateKeyedStoreICTrampoline_Megamorphic();
79 void GenerateKeyedStoreICBaseline();
81 void GenerateDefineKeyedOwnIC();
82 void GenerateDefineKeyedOwnICTrampoline();
83 void GenerateDefineKeyedOwnICBaseline();
85 void GenerateStoreInArrayLiteralIC();
86 void GenerateStoreInArrayLiteralICBaseline();
88 void TryProbeStubCache(
StubCache* stub_cache,
97 return TryProbeStubCache(stub_cache, lookup_start_object,
98 LoadReceiverMap(lookup_start_object), name,
99 if_handler, var_handler, if_miss);
104 return StubCachePrimaryOffset(name, map);
108 return StubCacheSecondaryOffset(name, map);
115 std::optional<
TNode<JSAny>> lookup_start_object = std::nullopt,
116 std::optional<
TNode<Smi>> enum_index = std::nullopt,
123 lookup_start_object_(lookup_start_object ? lookup_start_object.value()
125 enum_index_(enum_index),
126 cache_type_(cache_type) {}
134 lookup_start_object_(p->lookup_start_object_) {}
142 return lookup_start_object_.value();
172 std::optional<
TNode<JSAny>> lookup_start_object = std::nullopt)
178 lookup_start_object_(lookup_start_object ? lookup_start_object.value()
184 lookup_start_object_(p->lookup_start_object()) {
185 slot_ = [=] {
return p->
slot(); };
265 return mode_ == StoreICMode::kDefineNamedOwn;
268 return mode_ == StoreICMode::kDefineKeyedOwn;
271 return IsDefineNamedOwn() || IsDefineKeyedOwn();
275 return IsAnyDefineOwn() ? isolate->define_own_stub_cache()
276 : isolate->store_stub_cache();
291 enum class ICMode { kNonGlobalIC, kGlobalIC };
293 void HandleStoreICHandlerCase(
295 ICMode ic_mode, ElementSupport support_elements = kOnlyProperties);
297 kDontCheckPrototypeValidity = 0,
298 kCheckPrototypeValidity = 1 << 0,
299 kValidateTransitionHandler = 1 << 1,
300 kStoreTransitionMapFlagsMask =
301 kCheckPrototypeValidity | kValidateTransitionHandler,
303 void HandleStoreICTransitionMapHandlerCase(
const StoreICParameters* p,
306 StoreTransitionMapFlags flags);
315 void InvalidateValidityCellIfPrototype(
324 bool do_transitioning_store);
344 void LoadIC(
const LoadICParameters* p);
347 void LoadIC_Noninlined(
const LoadICParameters* p,
353 void LoadSuperIC(
const LoadICParameters* p);
360 void LoadIC_NoFeedback(
const LoadICParameters* p,
TNode<Smi> smi_typeof_mode);
361 void LoadSuperIC_NoFeedback(
const LoadICParameters* p);
365 void KeyedLoadIC(
const LoadICParameters* p, LoadAccessMode access_mode);
366 void KeyedLoadICGeneric(
const LoadICParameters* p);
367 void KeyedLoadICPolymorphicName(
const LoadICParameters* p,
368 LoadAccessMode access_mode);
370 void StoreIC(
const StoreICParameters* p);
376 void DefineKeyedOwnIC(
const StoreICParameters* p);
381 LazyNode<FeedbackVector> lazy_feedback_vector,
397 void HandlePolymorphicCase(
408 void TryEnumeratedKeyedLoad(
const LoadICParameters* p,
413 void HandleLoadICHandlerCase(
415 ExitPoint* exit_point, ICMode ic_mode = ICMode::kNonGlobalIC,
416 OnNonExistent on_nonexistent = OnNonExistent::kReturnUndefined,
417 ElementSupport support_elements = kOnlyProperties,
418 LoadAccessMode access_mode = LoadAccessMode::kLoad);
420 void HandleLoadICSmiHandlerCase(
const LazyLoadICParameters* p,
425 ElementSupport support_elements,
426 LoadAccessMode access_mode);
428 void HandleLoadICProtoHandler(
const LazyLoadICParameters* p,
434 LoadAccessMode access_mode);
436 void HandleLoadCallbackProperty(
const LazyLoadICParameters* p,
441 void HandleLoadAccessor(
const LazyLoadICParameters* p,
451#if V8_ENABLE_WEBASSEMBLY
468 void HandleLoadICSmiHandlerLoadNamedCase(
474 ElementSupport support_elements);
476 void HandleLoadICSmiHandlerHasNamedCase(
const LazyLoadICParameters* p,
486 const LazyNode<Context>& lazy_context,
492 const LazyNode<Context>& lazy_context,
493 const LazyNode<Name>& lazy_name,
504 void HandleStoreICProtoHandler(
const StoreICParameters* p,
506 Label* miss, ICMode ic_mode,
507 ElementSupport support_elements);
511 void HandleStoreICSmiHandlerJSSharedStructFieldCase(
519 void CheckPrototypeValidityCell(
TNode<Object> maybe_validity_cell,
521 void HandleStoreICNativeDataProperty(
const StoreICParameters* p,
525 void HandleStoreToProxy(
const StoreICParameters* p,
TNode<JSProxy> proxy,
526 Label* miss, ElementSupport support_elements);
539 const LoadICParameters* p,
Label* slow,
540 UseStubCache use_stub_cache = kUseStubCache);
548 template <
typename ICHandler,
typename ICParameters>
555 void CheckHeapObjectTypeMatchesDescriptor(
TNode<Word32T> handler_word,
561 void CheckDescriptorConsidersNumbersMutable(
TNode<Word32T> handler_word,
579 Label* unimplemented_elements_kind,
Label* out_of_bounds,
598 void BranchIfPrototypesHaveNoElements(
TNode<Map> receiver_map,
599 Label* definitely_no_elements,
600 Label* possibly_elements);