#include "src/ic/accessor-assembler.h"
#include <optional>
#include "src/ast/ast.h"
#include "src/builtins/builtins-constructor-gen.h"
#include "src/builtins/builtins-inl.h"
#include "src/codegen/code-stub-assembler-inl.h"
#include "src/codegen/interface-descriptors-inl.h"
#include "src/ic/handler-configuration.h"
#include "src/ic/ic.h"
#include "src/ic/keyed-store-generic.h"
#include "src/ic/stub-cache.h"
#include "src/logging/counters.h"
#include "src/objects/cell.h"
#include "src/objects/dictionary.h"
#include "src/objects/feedback-vector.h"
#include "src/objects/foreign.h"
#include "src/objects/heap-number.h"
#include "src/objects/megadom-handler.h"
#include "src/objects/module.h"
#include "src/objects/objects-inl.h"
#include "src/objects/property-details.h"
#include "src/objects/smi.h"
namespace v8 {
namespace internal {
#include "src/codegen/define-code-stub-assembler-macros.inc"
#define LOAD_KIND …
#define STORE_KIND …
TNode<MaybeObject> AccessorAssembler::LoadHandlerDataField(
TNode<DataHandler> handler, int data_index) { … }
TNode<HeapObjectReference> AccessorAssembler::TryMonomorphicCase(
TNode<TaggedIndex> slot, TNode<FeedbackVector> vector,
TNode<HeapObjectReference> weak_lookup_start_object_map, Label* if_handler,
TVariable<MaybeObject>* var_handler, Label* if_miss) { … }
void AccessorAssembler::HandlePolymorphicCase(
TNode<HeapObjectReference> weak_lookup_start_object_map,
TNode<WeakFixedArray> feedback, Label* if_handler,
TVariable<MaybeObject>* var_handler, Label* if_miss) { … }
void AccessorAssembler::TryMegaDOMCase(TNode<Object> lookup_start_object,
TNode<Map> lookup_start_object_map,
TVariable<MaybeObject>* var_handler,
TNode<Object> vector,
TNode<TaggedIndex> slot, Label* miss,
ExitPoint* exit_point) { … }
void AccessorAssembler::TryEnumeratedKeyedLoad(
const LoadICParameters* p, TNode<Map> lookup_start_object_map,
ExitPoint* exit_point) { … }
void AccessorAssembler::HandleLoadICHandlerCase(
const LazyLoadICParameters* p, TNode<MaybeObject> handler, Label* miss,
ExitPoint* exit_point, ICMode ic_mode, OnNonExistent on_nonexistent,
ElementSupport support_elements, LoadAccessMode access_mode) { … }
void AccessorAssembler::HandleLoadCallbackProperty(
const LazyLoadICParameters* p, TNode<JSObject> holder,
TNode<Word32T> handler_word, ExitPoint* exit_point) { … }
void AccessorAssembler::HandleLoadAccessor(
const LazyLoadICParameters* p,
TNode<FunctionTemplateInfo> function_template_info,
TNode<Word32T> handler_word, TNode<DataHandler> handler,
TNode<Uint32T> handler_kind, ExitPoint* exit_point) { … }
void AccessorAssembler::HandleLoadField(TNode<JSObject> holder,
TNode<Word32T> handler_word,
TVariable<Float64T>* var_double_value,
Label* rebox_double, Label* miss,
ExitPoint* exit_point) { … }
#if V8_ENABLE_WEBASSEMBLY
void AccessorAssembler::HandleLoadWasmField(
TNode<WasmObject> holder, TNode<Int32T> wasm_value_type,
TNode<IntPtrT> field_offset, TVariable<Float64T>* var_double_value,
Label* rebox_double, ExitPoint* exit_point) { … }
void AccessorAssembler::HandleLoadWasmField(
TNode<WasmObject> holder, TNode<Word32T> handler_word,
TVariable<Float64T>* var_double_value, Label* rebox_double,
ExitPoint* exit_point) { … }
#endif
TNode<Object> AccessorAssembler::LoadDescriptorValue(
TNode<Map> map, TNode<IntPtrT> descriptor_entry) { … }
TNode<MaybeObject> AccessorAssembler::LoadDescriptorValueOrFieldType(
TNode<Map> map, TNode<IntPtrT> descriptor_entry) { … }
void AccessorAssembler::HandleLoadICSmiHandlerCase(
const LazyLoadICParameters* p, TNode<Object> holder, TNode<Smi> smi_handler,
TNode<MaybeObject> handler, Label* miss, ExitPoint* exit_point,
ICMode ic_mode, OnNonExistent on_nonexistent,
ElementSupport support_elements, LoadAccessMode access_mode) { … }
void AccessorAssembler::HandleLoadICSmiHandlerLoadNamedCase(
const LazyLoadICParameters* p, TNode<Object> holder,
TNode<Uint32T> handler_kind, TNode<Word32T> handler_word,
Label* rebox_double, TVariable<Float64T>* var_double_value,
TNode<MaybeObject> handler, Label* miss, ExitPoint* exit_point,
ICMode ic_mode, OnNonExistent on_nonexistent,
ElementSupport support_elements) { … }
void AccessorAssembler::HandleLoadICSmiHandlerHasNamedCase(
const LazyLoadICParameters* p, TNode<Object> holder,
TNode<Uint32T> handler_kind, Label* miss, ExitPoint* exit_point,
ICMode ic_mode) { … }
template <typename ICHandler, typename ICParameters>
TNode<Object> AccessorAssembler::HandleProtoHandler(
const ICParameters* p, TNode<DataHandler> handler,
const OnCodeHandler& on_code_handler,
const OnFoundOnLookupStartObject& on_found_on_lookup_start_object,
Label* miss, ICMode ic_mode) { … }
void AccessorAssembler::HandleLoadICProtoHandler(
const LazyLoadICParameters* p, TNode<DataHandler> handler,
TVariable<Object>* var_holder, TVariable<MaybeObject>* var_smi_handler,
Label* if_smi_handler, Label* miss, ExitPoint* exit_point, ICMode ic_mode,
LoadAccessMode access_mode) { … }
void AccessorAssembler::EmitAccessCheck(TNode<Context> expected_native_context,
TNode<Context> context,
TNode<Object> receiver,
Label* can_access, Label* miss) { … }
void AccessorAssembler::JumpIfDataProperty(TNode<Uint32T> details,
Label* writable, Label* readonly) { … }
void AccessorAssembler::HandleStoreICNativeDataProperty(
const StoreICParameters* p, TNode<HeapObject> holder,
TNode<Word32T> handler_word) { … }
void AccessorAssembler::HandleStoreICSmiHandlerJSSharedStructFieldCase(
TNode<Context> context, TNode<Word32T> handler_word, TNode<JSObject> holder,
TNode<Object> value) { … }
void AccessorAssembler::HandleStoreICHandlerCase(
const StoreICParameters* p, TNode<MaybeObject> handler, Label* miss,
ICMode ic_mode, ElementSupport support_elements) { … }
void AccessorAssembler::HandleStoreICTransitionMapHandlerCase(
const StoreICParameters* p, TNode<Map> transition_map, Label* miss,
StoreTransitionMapFlags flags) { … }
void AccessorAssembler::UpdateMayHaveInterestingProperty(
TNode<PropertyDictionary> dict, TNode<Name> name) { … }
void AccessorAssembler::CheckFieldType(TNode<DescriptorArray> descriptors,
TNode<IntPtrT> name_index,
TNode<Word32T> representation,
TNode<Object> value, Label* bailout) { … }
TNode<BoolT> AccessorAssembler::IsPropertyDetailsConst(TNode<Uint32T> details) { … }
void AccessorAssembler::OverwriteExistingFastDataProperty(
TNode<HeapObject> object, TNode<Map> object_map,
TNode<DescriptorArray> descriptors, TNode<IntPtrT> descriptor_name_index,
TNode<Uint32T> details, TNode<Object> value, Label* slow,
bool do_transitioning_store) { … }
void AccessorAssembler::StoreJSSharedStructField(
TNode<Context> context, TNode<HeapObject> shared_struct,
TNode<Map> shared_struct_map, TNode<DescriptorArray> descriptors,
TNode<IntPtrT> descriptor_name_index, TNode<Uint32T> details,
TNode<Object> maybe_local_value) { … }
void AccessorAssembler::CheckPrototypeValidityCell(
TNode<Object> maybe_validity_cell, Label* miss) { … }
void AccessorAssembler::HandleStoreICProtoHandler(
const StoreICParameters* p, TNode<StoreHandler> handler, Label* slow,
Label* miss, ICMode ic_mode, ElementSupport support_elements) { … }
void AccessorAssembler::HandleStoreToProxy(const StoreICParameters* p,
TNode<JSProxy> proxy, Label* miss,
ElementSupport support_elements) { … }
void AccessorAssembler::HandleStoreICSmiHandlerCase(TNode<Word32T> handler_word,
TNode<JSObject> holder,
TNode<Object> value,
Label* miss) { … }
void AccessorAssembler::CheckHeapObjectTypeMatchesDescriptor(
TNode<Word32T> handler_word, TNode<JSObject> holder, TNode<Object> value,
Label* bailout) { … }
void AccessorAssembler::CheckDescriptorConsidersNumbersMutable(
TNode<Word32T> handler_word, TNode<JSObject> holder, Label* bailout) { … }
void AccessorAssembler::GotoIfNotSameNumberBitPattern(TNode<Float64T> left,
TNode<Float64T> right,
Label* miss) { … }
void AccessorAssembler::HandleStoreFieldAndReturn(
TNode<Word32T> handler_word, TNode<JSObject> holder, TNode<Object> value,
std::optional<TNode<Float64T>> double_value, Representation representation,
Label* miss) { … }
TNode<PropertyArray> AccessorAssembler::ExtendPropertiesBackingStore(
TNode<HeapObject> object, TNode<IntPtrT> index) { … }
void AccessorAssembler::EmitFastElementsBoundsCheck(
TNode<JSObject> object, TNode<FixedArrayBase> elements,
TNode<IntPtrT> intptr_index, TNode<BoolT> is_jsarray_condition,
Label* miss) { … }
void AccessorAssembler::EmitElementLoad(
TNode<HeapObject> object, TNode<Word32T> elements_kind,
TNode<IntPtrT> intptr_index, TNode<BoolT> is_jsarray_condition,
Label* if_hole, Label* rebox_double, TVariable<Float64T>* var_double_value,
Label* unimplemented_elements_kind, Label* out_of_bounds, Label* miss,
ExitPoint* exit_point, LoadAccessMode access_mode) { … }
void AccessorAssembler::InvalidateValidityCellIfPrototype(
TNode<Map> map, std::optional<TNode<Uint32T>> maybe_bitfield3) { … }
void AccessorAssembler::GenericElementLoad(
TNode<HeapObject> lookup_start_object, TNode<Map> lookup_start_object_map,
TNode<Int32T> lookup_start_object_instance_type, TNode<IntPtrT> index,
Label* slow) { … }
void AccessorAssembler::GenericPropertyLoad(
TNode<HeapObject> lookup_start_object, TNode<Map> lookup_start_object_map,
TNode<Int32T> lookup_start_object_instance_type, const LoadICParameters* p,
Label* slow, UseStubCache use_stub_cache) { … }
enum AccessorAssembler::StubCacheTable : int { … };
TNode<IntPtrT> AccessorAssembler::StubCachePrimaryOffset(TNode<Name> name,
TNode<Map> map) { … }
TNode<IntPtrT> AccessorAssembler::StubCacheSecondaryOffset(TNode<Name> name,
TNode<Map> map) { … }
void AccessorAssembler::TryProbeStubCacheTable(
StubCache* stub_cache, StubCacheTable table_id, TNode<IntPtrT> entry_offset,
TNode<Object> name, TNode<Map> map, Label* if_handler,
TVariable<MaybeObject>* var_handler, Label* if_miss) { … }
void AccessorAssembler::TryProbeStubCache(StubCache* stub_cache,
TNode<Object> lookup_start_object,
TNode<Map> lookup_start_object_map,
TNode<Name> name, Label* if_handler,
TVariable<MaybeObject>* var_handler,
Label* if_miss) { … }
void AccessorAssembler::LoadIC_BytecodeHandler(const LazyLoadICParameters* p,
ExitPoint* exit_point) { … }
void AccessorAssembler::LoadIC(const LoadICParameters* p) { … }
void AccessorAssembler::LoadSuperIC(const LoadICParameters* p) { … }
void AccessorAssembler::LoadIC_Noninlined(const LoadICParameters* p,
TNode<Map> lookup_start_object_map,
TNode<HeapObject> feedback,
TVariable<MaybeObject>* var_handler,
Label* if_handler, Label* miss,
ExitPoint* exit_point) { … }
void AccessorAssembler::LoadIC_NoFeedback(const LoadICParameters* p,
TNode<Smi> ic_kind) { … }
void AccessorAssembler::LoadSuperIC_NoFeedback(const LoadICParameters* p) { … }
void AccessorAssembler::LoadGlobalIC(TNode<HeapObject> maybe_feedback_vector,
const LazyNode<TaggedIndex>& lazy_slot,
const LazyNode<Context>& lazy_context,
const LazyNode<Name>& lazy_name,
TypeofMode typeof_mode,
ExitPoint* exit_point) { … }
void AccessorAssembler::LoadGlobalIC_TryPropertyCellCase(
TNode<FeedbackVector> vector, TNode<TaggedIndex> slot,
const LazyNode<Context>& lazy_context, ExitPoint* exit_point,
Label* try_handler, Label* miss) { … }
void AccessorAssembler::LoadGlobalIC_TryHandlerCase(
TNode<FeedbackVector> vector, TNode<TaggedIndex> slot,
const LazyNode<Context>& lazy_context, const LazyNode<Name>& lazy_name,
TypeofMode typeof_mode, ExitPoint* exit_point, Label* miss) { … }
void AccessorAssembler::ScriptContextTableLookup(
TNode<Name> name, TNode<NativeContext> native_context, Label* found_hole,
Label* not_found) { … }
void AccessorAssembler::LoadGlobalIC_NoFeedback(TNode<Context> context,
TNode<Object> name,
TNode<Smi> smi_typeof_mode) { … }
void AccessorAssembler::KeyedLoadIC(const LoadICParameters* p,
LoadAccessMode access_mode) { … }
void AccessorAssembler::KeyedLoadICGeneric(const LoadICParameters* p) { … }
void AccessorAssembler::KeyedLoadICPolymorphicName(const LoadICParameters* p,
LoadAccessMode access_mode) { … }
void AccessorAssembler::StoreIC(const StoreICParameters* p) { … }
void AccessorAssembler::StoreGlobalIC(const StoreICParameters* pp) { … }
void AccessorAssembler::StoreGlobalIC_PropertyCellCase(
TNode<PropertyCell> property_cell, TNode<Object> value,
ExitPoint* exit_point, Label* miss) { … }
void AccessorAssembler::KeyedStoreIC(const StoreICParameters* p) { … }
void AccessorAssembler::DefineKeyedOwnIC(const StoreICParameters* p) { … }
void AccessorAssembler::StoreInArrayLiteralIC(const StoreICParameters* p) { … }
void AccessorAssembler::GenerateLoadIC() { … }
void AccessorAssembler::GenerateLoadIC_Megamorphic() { … }
void AccessorAssembler::GenerateLoadIC_Noninlined() { … }
void AccessorAssembler::GenerateLoadIC_NoFeedback() { … }
void AccessorAssembler::GenerateLoadICTrampoline() { … }
void AccessorAssembler::GenerateLoadICBaseline() { … }
void AccessorAssembler::GenerateLoadICTrampoline_Megamorphic() { … }
void AccessorAssembler::GenerateLoadSuperIC() { … }
void AccessorAssembler::GenerateLoadSuperICBaseline() { … }
void AccessorAssembler::GenerateLoadGlobalIC_NoFeedback() { … }
void AccessorAssembler::GenerateLoadGlobalIC(TypeofMode typeof_mode) { … }
void AccessorAssembler::GenerateLoadGlobalICTrampoline(TypeofMode typeof_mode) { … }
void AccessorAssembler::GenerateLoadGlobalICBaseline(TypeofMode typeof_mode) { … }
void AccessorAssembler::LookupContext(LazyNode<Object> lazy_name,
TNode<TaggedIndex> depth,
LazyNode<TaggedIndex> lazy_slot,
TNode<Context> context,
TypeofMode typeof_mode) { … }
void AccessorAssembler::GenerateLookupContextTrampoline(
TypeofMode typeof_mode) { … }
void AccessorAssembler::GenerateLookupContextBaseline(TypeofMode typeof_mode) { … }
void AccessorAssembler::LookupGlobalIC(
LazyNode<Object> lazy_name, TNode<TaggedIndex> depth,
LazyNode<TaggedIndex> lazy_slot, TNode<Context> context,
LazyNode<FeedbackVector> lazy_feedback_vector, TypeofMode typeof_mode) { … }
void AccessorAssembler::GenerateLookupGlobalIC(TypeofMode typeof_mode) { … }
void AccessorAssembler::GenerateLookupGlobalICTrampoline(
TypeofMode typeof_mode) { … }
void AccessorAssembler::GenerateLookupGlobalICBaseline(TypeofMode typeof_mode) { … }
void AccessorAssembler::GenerateKeyedLoadIC() { … }
void AccessorAssembler::GenerateEnumeratedKeyedLoadIC() { … }
void AccessorAssembler::GenerateKeyedLoadIC_Megamorphic() { … }
void AccessorAssembler::GenerateKeyedLoadICTrampoline() { … }
void AccessorAssembler::GenerateKeyedLoadICBaseline() { … }
void AccessorAssembler::GenerateEnumeratedKeyedLoadICBaseline() { … }
void AccessorAssembler::GenerateKeyedLoadICTrampoline_Megamorphic() { … }
void AccessorAssembler::GenerateKeyedLoadIC_PolymorphicName() { … }
void AccessorAssembler::GenerateStoreGlobalIC() { … }
void AccessorAssembler::GenerateStoreGlobalICTrampoline() { … }
void AccessorAssembler::GenerateStoreGlobalICBaseline() { … }
void AccessorAssembler::GenerateStoreIC() { … }
void AccessorAssembler::GenerateStoreIC_Megamorphic() { … }
void AccessorAssembler::GenerateStoreICTrampoline() { … }
void AccessorAssembler::GenerateStoreICTrampoline_Megamorphic() { … }
void AccessorAssembler::GenerateStoreICBaseline() { … }
void AccessorAssembler::GenerateDefineNamedOwnIC() { … }
void AccessorAssembler::GenerateDefineNamedOwnICTrampoline() { … }
void AccessorAssembler::GenerateDefineNamedOwnICBaseline() { … }
void AccessorAssembler::GenerateKeyedStoreIC() { … }
void AccessorAssembler::GenerateKeyedStoreICTrampoline() { … }
void AccessorAssembler::GenerateKeyedStoreICTrampoline_Megamorphic() { … }
void AccessorAssembler::GenerateKeyedStoreICBaseline() { … }
void AccessorAssembler::GenerateDefineKeyedOwnIC() { … }
void AccessorAssembler::GenerateDefineKeyedOwnICTrampoline() { … }
void AccessorAssembler::GenerateDefineKeyedOwnICBaseline() { … }
void AccessorAssembler::GenerateStoreInArrayLiteralIC() { … }
void AccessorAssembler::GenerateStoreInArrayLiteralICBaseline() { … }
void AccessorAssembler::GenerateCloneObjectIC_Slow() { … }
void AccessorAssembler::GenerateCloneObjectICBaseline() { … }
void AccessorAssembler::GenerateCloneObjectIC() { … }
void AccessorAssembler::GenerateKeyedHasIC() { … }
void AccessorAssembler::GenerateKeyedHasICBaseline() { … }
void AccessorAssembler::GenerateKeyedHasIC_Megamorphic() { … }
void AccessorAssembler::GenerateKeyedHasIC_PolymorphicName() { … }
void AccessorAssembler::BranchIfPrototypesHaveNoElements(
TNode<Map> receiver_map, Label* definitely_no_elements,
Label* possibly_elements) { … }
#undef LOAD_KIND
#undef STORE_KIND
#include "src/codegen/undef-code-stub-assembler-macros.inc"
}
}