34bool CanInlinePropertyAccess(MapRef map,
AccessMode access_mode) {
42 static_assert(ODDBALL_TYPE == LAST_PRIMITIVE_HEAP_OBJECT_TYPE);
44 if (map.instance_type() < LAST_PRIMITIVE_HEAP_OBJECT_TYPE)
return true;
45 if (IsJSObjectMap(*map.object())) {
46 if (map.is_dictionary_map()) {
49 map.object()->is_prototype_map();
51 return !map.object()->has_named_interceptor() &&
53 !map.is_access_check_needed();
59bool HasFieldRepresentationDependenciesOnMap(
60 ZoneVector<CompilationDependency const*>& dependencies,
62 for (
auto dep : dependencies) {
63 if (CompilationDependencies::IsFieldRepresentationDependencyOnMap(
64 dep, field_owner_map)) {
75 switch (access_mode) {
81 return os <<
"StoreInLiteral";
85 return os <<
"Define";
94 lookup_start_object_maps_(lookup_start_object_maps),
95 transition_sources_(zone) {
106 OptionalJSObjectRef holder) {
115 Type field_type,
MapRef field_owner_map, OptionalMapRef field_map,
116 OptionalJSObjectRef holder, OptionalMapRef transition_map) {
120 HasFieldRepresentationDependenciesOnMap(
123 : receiver_map.
object()));
127 std::move(dependencies));
135 Type field_type,
MapRef field_owner_map, OptionalMapRef field_map,
136 OptionalJSObjectRef holder, OptionalMapRef transition_map) {
140 field_owner_map,
field_map, {{receiver_map}, zone},
141 std::move(dependencies));
146 Zone* zone,
MapRef receiver_map, OptionalJSObjectRef holder,
147 OptionalObjectRef constant, OptionalJSObjectRef api_holder) {
149 api_holder, {} , {{receiver_map}, zone});
158 {} , {{receiver_map}, zone});
171 {{receiver_map}, zone});
178 {{receiver_map}, zone});
193 Zone* zone,
MapRef receiver_map, OptionalJSObjectRef holder,
194 ObjectRef constant, OptionalJSObjectRef api_holder,
NameRef property_name) {
196 constant, api_holder, property_name,
197 {{receiver_map}, zone});
202 lookup_start_object_maps_(zone),
203 unrecorded_dependencies_(zone),
212 lookup_start_object_maps_(lookup_start_object_maps),
214 unrecorded_dependencies_(zone),
221 OptionalObjectRef constant, OptionalJSObjectRef api_holder,
224 lookup_start_object_maps_(lookup_start_object_maps),
227 api_holder_(api_holder),
228 unrecorded_dependencies_(zone),
237 Kind kind, OptionalJSObjectRef holder, OptionalMapRef transition_map,
239 Type field_type,
MapRef field_owner_map, OptionalMapRef field_map,
243 lookup_start_object_maps_(lookup_start_object_maps),
245 unrecorded_dependencies_(
std::move(unrecorded_dependencies)),
246 transition_map_(transition_map),
247 field_index_(field_index),
248 field_representation_(field_representation),
249 field_type_(field_type),
250 field_owner_map_(field_owner_map),
251 field_map_(field_map),
262 lookup_start_object_maps_(lookup_start_object_maps),
264 unrecorded_dependencies_(zone),
267 dictionary_index_(dictionary_index),
276 return lhs->equals(rhs.
value());
281 dst->
insert(dst->
end(), src.begin(), src.end());
288 if (
kind_ != that->kind_)
return false;
289 if (!OptionalRefEquals(
holder_, that->holder_))
return false;
303 that->field_index_.GetFieldAccessStubKey()) {
307 switch (access_mode) {
312 that->field_representation_.IsDouble()) {
317 if (!OptionalRefEquals(
field_map_, that->field_map_)) {
329 if (!OptionalRefEquals(
field_map_, that->field_map_) ||
347 if (!OptionalRefEquals(
constant_, that->constant_))
return false;
350 DCHECK(that->unrecorded_dependencies_.empty());
366 DCHECK(that->unrecorded_dependencies_.empty());
372 DCHECK_EQ(that->lookup_start_object_maps_.size(), 1);
389 if (!map.CanInlineElementAccess())
return {};
396 AccessMode access_mode = feedback.keyed_mode().access_mode();
402 std::optional<ElementAccessInfo> access_info =
404 if (access_info.has_value()) {
410 for (
auto const& group : feedback.transition_groups()) {
412 OptionalMapRef target = group.front();
413 std::optional<ElementAccessInfo> access_info =
415 if (!access_info.has_value())
return false;
417 for (
size_t i = 1;
i < group.
size(); ++
i) {
418 OptionalMapRef map_ref = group[
i];
419 if (!map_ref.has_value())
continue;
420 access_info->AddTransitionSource(map_ref.value());
433 map.instance_descriptors(
broker()).object();
435 int index = descriptors->GetFieldIndex(descriptor);
437 if (details_representation.
IsNone()) {
446 details_representation);
449 Type field_type = name.object()->IsPrivateBrand() ? Type::OtherInternal()
450 : Type::NonInternal();
451 OptionalMapRef field_map;
457 descriptors->GetFieldType(descriptor));
458 OptionalObjectRef descriptors_field_type_ref =
460 if (!descriptors_field_type_ref.has_value())
return Invalid();
467 if (details_representation.
IsSmi()) {
470 dependencies()->FieldRepresentationDependencyOffTheRecord(
471 map, field_owner_map, descriptor, details_representation));
472 }
else if (details_representation.
IsDouble()) {
475 dependencies()->FieldRepresentationDependencyOffTheRecord(
476 map, field_owner_map, descriptor, details_representation));
478 if (
IsNone(*descriptors_field_type)) {
482 switch (access_mode) {
493 dependencies()->FieldRepresentationDependencyOffTheRecord(
494 map, field_owner_map, descriptor, details_representation));
495 if (
IsClass(*descriptors_field_type)) {
497 OptionalMapRef maybe_field_map =
499 if (!maybe_field_map.has_value())
return Invalid();
500 field_map = maybe_field_map;
511 map, field_owner_map, descriptor,
512 descriptors_field_type_ref.value()));
515 map.GetPropertyDetails(
broker_, descriptor).constness();
519 broker(),
zone(), receiver_map, std::move(unrecorded_dependencies),
520 field_index, details_representation, field_type, field_owner_map,
521 field_map, holder, {});
524 map, field_owner_map, descriptor);
525 unrecorded_dependencies.
push_back(constness_dep);
527 zone(), receiver_map, std::move(unrecorded_dependencies), field_index,
528 details_representation, field_type, field_owner_map, field_map,
536using AccessorsObjectGetter = std::function<Handle<Object>()>;
542 AccessorsObjectGetter get_accessors) {
543 if (holder_map.
instance_type() == JS_MODULE_NAMESPACE_TYPE) {
551 Cast<Cell>(module_namespace->module()->exports()->Lookup(
552 isolate, name.object(),
567 if (!cell_ref.has_value()) {
581 DirectHandle<Object> maybe_accessors = get_accessors();
582 if (!IsAccessorPair(*maybe_accessors)) {
593 OptionalJSObjectRef api_holder_ref;
594 if (!IsJSFunction(*accessor)) {
596 if (!optimization.is_simple_api_call() ||
597 optimization.IsCrossContextLazyAccessorPair(
602 std::optional<Tagged<NativeContext>> holder_creation_context =
603 holder->object()->GetCreationContext();
604 CHECK(holder_creation_context.has_value());
606 holder_creation_context.value());
611 optimization.LookupHolderOfExpectedType(
618 api_holder.is_null());
620 !api_holder.is_null());
622 if (!api_holder.is_null()) {
628 std::optional<Tagged<Name>> cached_property_name =
630 if (cached_property_name.has_value()) {
631 OptionalNameRef cached_property_name_ref =
633 if (cached_property_name_ref.has_value()) {
635 holder_map, cached_property_name_ref.value(), access_mode);
636 if (!access_info.IsInvalid())
return access_info;
642 CHECK(!api_holder_ref.has_value());
644 zone, receiver_map, holder, accessor_ref.value(), api_holder_ref, name);
647 zone, receiver_map, holder, accessor_ref.value(), api_holder_ref);
661 descriptors->Search(*name.object(), *holder_map.
object(),
true));
663 auto get_accessors = [&]() {
665 descriptors->GetStrongValue(descriptor));
668 receiver_map, name, holder_map, holder,
669 access_mode, get_accessors);
687 zone(), receiver_map, holder, dictionary_index, name);
690 auto get_accessors = [&]() {
695 receiver_map, name, holder.
map(
broker()),
696 holder, access_mode, get_accessors);
702 if (map.is_dictionary_map()) {
704 DCHECK(map.object()->is_prototype_map());
708 if (!maybe_holder.has_value()) {
720 *index_out = dict->FindEntry(
isolate(), name.object());
722 *details_out = dict->DetailsAt(*index_out);
726 *index_out = dict->FindEntry(
isolate(), name.object());
728 *details_out = dict->DetailsAt(*index_out);
733 *map.instance_descriptors(
broker()).object();
734 *index_out = descriptors->Search(*name.object(), *map.object(),
true);
736 *details_out = descriptors->GetDetails(*index_out);
745 CHECK(name.IsUniqueName());
757 if (!CanInlinePropertyAccess(map, access_mode)) {
764 if (!access_info.
IsInvalid())
return access_info;
768 bool dictionary_prototype_on_chain =
false;
769 bool fast_mode_prototype_on_chain =
false;
773 OptionalJSObjectRef holder;
780 OptionalJSFunctionRef constructor =
783 if (!constructor.has_value())
return Invalid();
784 map = constructor->initial_map(
broker());
785 DCHECK(!map.IsPrimitiveMap());
795 if (index.is_found()) {
797 DCHECK(!map.is_dictionary_map());
821 if (map.is_dictionary_map()) {
824 if (fast_mode_prototype_on_chain) {
835 receiver_map, name, holder.value(), index, access_mode, details);
838 if (dictionary_prototype_on_chain) {
868 holder, index, access_mode);
875 DCHECK(!index.is_found());
879 if (IsJSTypedArrayMap(*map.object()) && name.IsString()) {
882 *name_str.
object(),
broker()->local_isolate_or_isolate());
891 if (name.object()->IsPrivate()) {
900 if (name.object()->IsPrivate()) {
906 DCHECK(holder->object()->map()->is_prototype_map());
909 fast_mode_prototype_on_chain =
910 fast_mode_prototype_on_chain || !map.is_dictionary_map();
911 dictionary_prototype_on_chain =
912 dictionary_prototype_on_chain || map.is_dictionary_map();
921 if (!IsJSObjectMap(*map_prototype_map.
object())) {
923 if (!prototype.IsNull()) {
924 DCHECK(IsJSProxy(*prototype.object()) ||
929 DCHECK(prototype.IsNull());
931 if (dictionary_prototype_on_chain) {
953 CHECK(prototype.IsJSObject());
954 holder = prototype.AsJSObject();
955 map = map_prototype_map;
957 if (!CanInlinePropertyAccess(map, access_mode)) {
977 if (merged_access_infos.
size() == 1) {
979 if (!
result.IsInvalid()) {
998 if (access_infos.
empty())
return false;
1001 if (info.IsInvalid())
return false;
1013 for (
auto it = infos.
begin(),
end = infos.
end(); it !=
end; ++it) {
1014 bool merged =
false;
1015 for (
auto ot = it + 1; ot !=
end; ++ot) {
1016 if (ot->Merge(&(*it), access_mode,
zone())) {
1021 if (!merged)
result->push_back(*it);
1040 if (this_kind == that_kind)
return Just(this_kind);
1043 return Just(this_kind);
1046 return Just(that_kind);
1056 if (feedback.transition_groups().empty())
return {};
1058 DCHECK(!feedback.transition_groups().front().empty());
1059 MapRef first_map = feedback.transition_groups().front().front();
1064 for (
auto const& group : feedback.transition_groups()) {
1065 for (
MapRef map : group) {
1066 if (map.instance_type() != instance_type ||
1067 !map.CanInlineElementAccess()) {
1070 if (!GeneralizeElementsKind(elements_kind, map.elements_kind())
1071 .To(&elements_kind)) {
1074 maps.push_back(map);
1084 if (IsStringMap(*map.object())) {
1086 isolate()->factory()->length_string())) {
1091 if (IsJSPrimitiveWrapperMap(*map.object()) &&
1095 isolate()->factory()->length_string())) {
1099 if (
v8_flags.typed_array_length_loading && IsJSTypedArrayMap(*map.object()) &&
1102 isolate()->factory()->length_string()) &&
1114 Type field_type = Type::NonInternal();
1116 if (IsJSArrayMap(*map.object())) {
1136 field_index, field_representation,
1137 field_type,
map, {}, {}, {});
1151 if (!maybe_transition_map.has_value())
return Invalid();
1152 MapRef transition_map = maybe_transition_map.value();
1170 *transition_map.
object(), index, details_representation);
1171 Type field_type = Type::NonInternal();
1172 OptionalMapRef field_map;
1177 if (details_representation.
IsSmi()) {
1180 dependencies()->FieldRepresentationDependencyOffTheRecord(
1181 transition_map, transition_map, number, details_representation));
1182 }
else if (details_representation.
IsDouble()) {
1185 dependencies()->FieldRepresentationDependencyOffTheRecord(
1186 transition_map, transition_map, number, details_representation));
1193 OptionalObjectRef descriptors_field_type_ref =
1195 if (!descriptors_field_type_ref.has_value())
return Invalid();
1197 if (
IsNone(*descriptors_field_type)) {
1204 dependencies()->FieldRepresentationDependencyOffTheRecord(
1205 transition_map, transition_map, number, details_representation));
1206 if (
IsClass(*descriptors_field_type)) {
1209 transition_map, transition_map, number,
1210 *descriptors_field_type_ref));
1212 OptionalMapRef maybe_field_map =
1214 if (!maybe_field_map.has_value())
return Invalid();
1215 field_map = maybe_field_map;
1222 dependencies()->TransitionDependencyOffTheRecord(transition_map));
1229 switch (constness) {
1232 broker(),
zone(), map, std::move(unrecorded_dependencies),
1233 field_index, details_representation, field_type, transition_map,
1234 field_map, holder, transition_map);
1237 transition_map, transition_map, number);
1238 unrecorded_dependencies.
push_back(constness_dep);
1240 zone(), map, std::move(unrecorded_dependencies), field_index,
1241 details_representation, field_type, transition_map, field_map, holder,
#define SLOW_DCHECK(condition)
static bool IsJSObjectFieldAccessor(Isolate *isolate, DirectHandle< Map > map, DirectHandle< Name > name, FieldIndex *field_index)
static FieldIndex ForPropertyIndex(Tagged< Map > map, int index, Representation representation=Representation::Tagged())
int GetFieldAccessStubKey() const
static Tagged< Map > AsClass(Tagged< FieldType > type)
static constexpr bool kFieldTypesCanBeClearedOnGC
static std::optional< Tagged< Name > > TryGetCachedPropertyName(Isolate *isolate, Tagged< Object > getter)
static InternalIndex NotFound()
static Handle< Object > DictionaryPropertyAt(Isolate *isolate, DirectHandle< JSObject > object, InternalIndex dict_index)
bool Equals(Tagged< Name > other)
PropertyAttributes attributes() const
PropertyLocation location() const
Representation representation() const
PropertyKind kind() const
static constexpr PropertyDetails Empty(PropertyCellType cell_type=PropertyCellType::kNoCell)
PropertyConstness constness() const
constexpr bool IsHeapObject() const
constexpr bool IsNone() const
constexpr bool IsTagged() const
bool Equals(const Representation &other) const
constexpr bool IsSmi() const
static constexpr Representation Smi()
static constexpr Representation Tagged()
constexpr bool IsDouble() const
static constexpr int ToInt(const Tagged< Object > object)
V8_INLINE constexpr bool is_null() const
Tagged< Map > SearchTransition(Tagged< Name > name, PropertyKind kind, PropertyAttributes attributes)
T * insert(const T *pos, It first, It last)
void push_back(const T &value)
bool ComputeElementAccessInfos(ElementAccessFeedback const &feedback, ZoneVector< ElementAccessInfo > *access_infos) const
AccessInfoFactory(JSHeapBroker *broker, Zone *zone)
std::optional< ElementAccessInfo > ConsolidateElementLoad(ElementAccessFeedback const &feedback) const
PropertyAccessInfo LookupTransition(MapRef map, NameRef name, OptionalJSObjectRef holder, PropertyAttributes attrs) const
bool FinalizePropertyAccessInfos(ZoneVector< PropertyAccessInfo > infos, AccessMode access_mode, ZoneVector< PropertyAccessInfo > *result) const
JSHeapBroker *const broker_
TypeCache const *const type_cache_
JSHeapBroker * broker() const
PropertyAccessInfo ComputeDictionaryProtoAccessInfo(MapRef receiver_map, NameRef name, JSObjectRef holder, InternalIndex dict_index, AccessMode access_mode, PropertyDetails details) const
PropertyAccessInfo LookupSpecialFieldAccessor(MapRef map, NameRef name) const
bool TryLoadPropertyDetails(MapRef map, OptionalJSObjectRef maybe_holder, NameRef name, InternalIndex *index_out, PropertyDetails *details_out) const
void MergePropertyAccessInfos(ZoneVector< PropertyAccessInfo > infos, AccessMode access_mode, ZoneVector< PropertyAccessInfo > *result) const
PropertyAccessInfo Invalid() const
PropertyAccessInfo FinalizePropertyAccessInfosAsOne(ZoneVector< PropertyAccessInfo > infos, AccessMode access_mode) const
PropertyAccessInfo ComputePropertyAccessInfo(MapRef map, NameRef name, AccessMode access_mode) const
std::optional< ElementAccessInfo > ComputeElementAccessInfo(MapRef map, AccessMode access_mode) const
PropertyAccessInfo ComputeDataFieldAccessInfo(MapRef receiver_map, MapRef map, NameRef name, OptionalJSObjectRef holder, InternalIndex descriptor, AccessMode access_mode) const
Isolate * isolate() const
PropertyAccessInfo ComputeAccessorDescriptorAccessInfo(MapRef receiver_map, NameRef name, MapRef map, OptionalJSObjectRef holder, InternalIndex descriptor, AccessMode access_mode) const
CompilationDependencies * dependencies() const
bool DependOnTypedArrayLengthProtector()
CompilationDependency const * FieldConstnessDependencyOffTheRecord(MapRef map, MapRef owner, InternalIndex descriptor)
void RecordDependency(CompilationDependency const *dependency)
bool DependOnArrayBufferDetachingProtector()
IndirectHandle< DescriptorArray > object() const
ZoneVector< MapRef > const & lookup_start_object_maps() const
ElementAccessInfo(ZoneVector< MapRef > &&lookup_start_object_maps, ElementsKind elements_kind, Zone *zone)
V8_EXPORT_PRIVATE MapRef map(JSHeapBroker *broker) const
LocalIsolate * local_isolate_or_isolate() const
Handle< T > CanonicalPersistentHandle(Tagged< T > object)
CompilationDependencies * dependencies() const
NativeContextRef target_native_context() const
Isolate * isolate() const
IndirectHandle< JSObject > object() const
PropertyDetails GetPropertyDetails(JSHeapBroker *broker, InternalIndex descriptor_index) const
DescriptorArrayRef instance_descriptors(JSHeapBroker *broker) const
IndirectHandle< Map > object() const
InstanceType instance_type() const
ElementsKind elements_kind() const
MapRef FindFieldOwner(JSHeapBroker *broker, InternalIndex descriptor_index) const
bool is_dictionary_map() const
bool IsPrimitiveMap() const
IndirectHandle< NativeContext > object() const
OptionalJSFunctionRef GetConstructorFunction(JSHeapBroker *broker, MapRef map) const
constexpr bool has_value() const
OptionalMapRef field_map_
Representation field_representation() const
OptionalMapRef field_owner_map_
@ kDictionaryProtoAccessorConstant
@ kDictionaryProtoDataConstant
ConstFieldInfo GetConstFieldInfo() const
static PropertyAccessInfo TypedArrayLength(Zone *zone, MapRef receiver_map)
OptionalMapRef transition_map() const
PropertyAccessInfo(Zone *zone)
static PropertyAccessInfo FastAccessorConstant(Zone *zone, MapRef receiver_map, OptionalJSObjectRef holder, OptionalObjectRef constant, OptionalJSObjectRef api_holder)
InternalIndex dictionary_index() const
static PropertyAccessInfo NotFound(Zone *zone, MapRef receiver_map, OptionalJSObjectRef holder)
bool Merge(PropertyAccessInfo const *that, AccessMode access_mode, Zone *zone) V8_WARN_UNUSED_RESULT
OptionalJSObjectRef holder_
static PropertyAccessInfo StringWrapperLength(Zone *zone, MapRef receiver_map)
OptionalJSObjectRef holder() const
FieldIndex field_index() const
void set_elements_kind(ElementsKind elements_kind)
OptionalMapRef transition_map_
InternalIndex dictionary_index_
static PropertyAccessInfo DictionaryProtoDataConstant(Zone *zone, MapRef receiver_map, JSObjectRef holder, InternalIndex dict_index, NameRef name)
ZoneVector< CompilationDependency const * > unrecorded_dependencies_
static PropertyAccessInfo StringLength(Zone *zone, MapRef receiver_map)
bool IsFastDataConstant() const
static PropertyAccessInfo Invalid(Zone *zone)
OptionalMapRef field_map() const
static PropertyAccessInfo ModuleExport(Zone *zone, MapRef receiver_map, CellRef cell)
static PropertyAccessInfo DataField(JSHeapBroker *broker, Zone *zone, MapRef receiver_map, ZoneVector< CompilationDependency const * > &&unrecorded_dependencies, FieldIndex field_index, Representation field_representation, Type field_type, MapRef field_owner_map, OptionalMapRef field_map, OptionalJSObjectRef holder, OptionalMapRef transition_map)
OptionalObjectRef constant_
void RecordDependencies(CompilationDependencies *dependencies)
ZoneVector< MapRef > lookup_start_object_maps_
static PropertyAccessInfo FastDataConstant(Zone *zone, MapRef receiver_map, ZoneVector< CompilationDependency const * > &&unrecorded_dependencies, FieldIndex field_index, Representation field_representation, Type field_type, MapRef field_owner_map, OptionalMapRef field_map, OptionalJSObjectRef holder, OptionalMapRef transition_map)
static PropertyAccessInfo DictionaryProtoAccessorConstant(Zone *zone, MapRef receiver_map, OptionalJSObjectRef holder, ObjectRef constant, OptionalJSObjectRef api_holder, NameRef name)
Representation field_representation_
IndirectHandle< String > object() const
Type const kFixedDoubleArrayLengthType
Type const kJSArrayLengthType
Type const kFixedArrayLengthType
static Type Union(Type type1, Type type2, Zone *zone)
static Type SignedSmall()
#define V8_ENABLE_SWISS_NAME_DICTIONARY_BOOL
#define V8_DICT_PROPERTY_CONST_TRACKING_BOOL
JSObjectRef const holder_
JSHeapBroker *const broker_
const ObjectRef constant_
ElementsKind elements_kind_
ZoneVector< RpoNumber > & result
V8_INLINE const Operation & Get(const Graph &graph, OpIndex index)
bool IsAnyStore(AccessMode mode)
OptionalRef< typename ref_traits< T >::ref_type > TryMakeRef(JSHeapBroker *broker, ObjectData *data)
bool IsDefiningStore(AccessMode mode)
std::ostream & operator<<(std::ostream &os, AccessMode access_mode)
bool IsNone(Tagged< FieldType > obj)
constexpr bool IsHoleyElementsKind(ElementsKind kind)
bool IsMoreGeneralElementsKindTransition(ElementsKind from_kind, ElementsKind to_kind)
Map::Bits1::HasPrototypeSlotBit Map::Bits1::HasNamedInterceptorBit Map::Bits1::IsUndetectableBit Map::Bits1::IsConstructorBit Map::Bits2::IsImmutablePrototypeBit Map::Bits3::IsDeprecatedBit is_prototype_map
bool IsRabGsabTypedArrayElementsKind(ElementsKind kind)
bool IsSpecialIndex(Tagged< String > string)
refactor address components for immediate indexing make OptimizeMaglevOnNextCall optimize to turbofan instead of maglev filter for tracing turbofan compilation trace turbo cfg trace TurboFan s graph trimmer trace TurboFan s control equivalence trace TurboFan s register allocator trace stack load store counters for optimized code in run fuzzing &&concurrent_recompilation trace_turbo trace_turbo_scheduled trace_turbo_stack_accesses verify TurboFan machine graph of code stubs enable FixedArray bounds checks print TurboFan statistics of wasm compilations maximum cumulative size of bytecode considered for inlining scale factor of bytecode size used to calculate the inlining budget maximum bytecode size to be considered for turbofan optimization
@ SLOW_STRING_WRAPPER_ELEMENTS
@ FAST_STRING_WRAPPER_ELEMENTS
bool IsClass(Tagged< FieldType > obj)
ElementsKind GetHoleyElementsKind(ElementsKind packed_kind)
bool IsBooleanMap(Tagged< Map > map)
bool IsFastElementsKind(ElementsKind kind)
V8_EXPORT_PRIVATE FlagValues v8_flags
V8_INLINE bool IsWasmObject(T obj, Isolate *=nullptr)
constexpr bool IsDoubleElementsKind(ElementsKind kind)
Tagged< To > Cast(Tagged< From > value, const v8::SourceLocation &loc=INIT_SOURCE_LOCATION_IN_DEBUG)
static constexpr RelaxedLoadTag kRelaxedLoad
static constexpr AcquireLoadTag kAcquireLoad
Maybe< T > Just(const T &t)
#define DCHECK_IMPLIES(v1, v2)
#define CHECK_EQ(lhs, rhs)
#define DCHECK(condition)
#define DCHECK_EQ(v1, v2)
static ConstFieldInfo None()