39 if (!map.IsStringMap())
return false;
47 if (!map.IsJSPrimitiveWrapperMap())
return false;
48 auto elements_kind = map.elements_kind();
60 if (!map.IsJSTypedArrayMap())
return false;
71 for (MapRef map : maps) {
72 if (map.instance_type() != HEAP_NUMBER_TYPE)
return false;
98 if (HasOnlyNumberMaps(
broker, maps)) {
111 bool has_deprecated_map_without_migration_target) {
113 if (
m.HasResolvedValue()) {
117 if (map.equals(object_map)) {
125 bool has_migration_target =
false;
128 if (map.is_migration_target()) {
129 has_migration_target =
true;
133 if (has_migration_target) {
135 }
else if (has_deprecated_map_without_migration_target) {
143 Control control, ObjectRef value) {
144 if (value.IsHeapObject()) {
146 if (
m.Is(value.AsHeapObject().object()))
return receiver;
153 check, *effect, control);
161 simplified()->CheckSmi(feedback_source), value, *effect, control);
169 simplified()->CheckNumber(feedback_source), value, *effect, control);
176 Node* number = *effect =
178 value, *effect, control);
184 OptionalJSObjectRef holder = access_info.
holder();
185 if (holder.has_value()) {
188 return lookup_start_object;
193 switch (representation.
kind()) {
213 OptionalObjectRef value = access_info.
holder()->GetOwnDictionaryProperty(
215 if (!value)
return {};
221 if (!IsJSReceiverMap(*map_handle)) {
226 *map_handle, *
broker()->target_native_context().
object())
231 DCHECK(IsJSObjectMap(*map.object()));
242 Node* lookup_start_object) {
246 OptionalJSObjectRef holder = access_info.
holder();
249 if (!holder.has_value()) {
251 if (lookup_start_object->
opcode() == IrOpcode::kCheckString ||
252 lookup_start_object->
opcode() ==
253 IrOpcode::kCheckStringOrStringWrapper) {
255 lookup_start_object = lookup_start_object->
InputAt(0);
258 if (!
m.HasResolvedValue() || !
m.Ref(
broker()).IsJSObject())
return nullptr;
266 return map.equals(lookup_start_object_map);
272 holder =
m.Ref(
broker()).AsJSObject();
276 std::optional<Float64> value = holder->GetOwnFastConstantDoubleProperty(
281 OptionalObjectRef value = holder->GetOwnFastConstantDataProperty(
290 bool is_inobject,
Node** effect,
292 Node* storage = holder;
297 storage, *effect, *control);
299 if (field_access.machine_type.representation() ==
309 "BuildLoadDataField",
310 field_access.const_field_info};
312 simplified()->LoadField(storage_access), storage, *effect, *control);
319 storage, *effect, *control);
320 Node* map = *effect =
322 storage, *effect, *control);
323 Node* is_heap_number =
325 jsgraph()->HeapNumberMapConstant());
327 simplified()->CheckIf(DeoptimizeReason::kNotAHeapNumber),
328 is_heap_number, *effect, *control);
334 Type::OtherInternal(),
337 "BuildLoadDataField",
338 field_access.const_field_info};
340 simplified()->LoadField(storage_access), storage, *effect, *control);
344 field_access = value_field_access;
347 simplified()->LoadField(field_access), storage, *effect, *control);
353 Node* lookup_start_object,
Node** effect,
Node** control) {
357 lookup_start_object)) {
373 "BuildLoadDataField",
379 OptionalMapRef field_map = access_info.
field_map();
380 if (field_map.has_value()) {
381 if (field_map->is_stable()) {
383 field_access.
map = field_map;
static MachineType TypeForRepresentation(const MachineRepresentation &rep, bool isSigned=true)
static constexpr MachineType AnyTagged()
static constexpr MachineType TaggedPointer()
static std::optional< Tagged< JSFunction > > GetConstructorFunction(Tagged< Map > map, Tagged< Context > native_context)
constexpr Kind kind() const
constexpr bool IsDouble() const
void insert(T handle, Zone *zone)
static FieldAccess ForMap(WriteBarrierKind write_barrier=kMapWriteBarrier)
static FieldAccess ForHeapNumberValue()
static FieldAccess ForJSObjectPropertiesOrHashKnownPointer()
void DependOnConstantInDictionaryPrototypeChain(MapRef receiver_map, NameRef property_name, ObjectRef constant, PropertyKind kind)
void DependOnStableMap(MapRef map)
V8_EXPORT_PRIVATE MapRef map(JSHeapBroker *broker) const
SimplifiedOperatorBuilder * simplified() const
Isolate * isolate() const
Node * ConstantNoHole(ObjectRef ref, JSHeapBroker *broker)
CommonOperatorBuilder * common() const
constexpr IrOpcode::Value opcode() const
Node * InputAt(int index) const
CompilationDependencies * dependencies() const
Node * TryFoldLoadConstantDataField(NameRef name, PropertyAccessInfo const &access_info, Node *lookup_start_object)
static MachineRepresentation ConvertRepresentation(Representation representation)
Node * ResolveHolder(PropertyAccessInfo const &access_info, Node *lookup_start_object)
CommonOperatorBuilder * common() const
JSGraph * jsgraph() const
SimplifiedOperatorBuilder * simplified() const
Node * BuildCheckNumberFitsInt32(Node *value, Effect *effect, Control control, FeedbackSource feedback_source=FeedbackSource())
bool TryBuildNumberCheck(JSHeapBroker *broker, ZoneVector< MapRef > const &maps, Node **receiver, Effect *effect, Control control)
Node * BuildCheckValue(Node *receiver, Effect *effect, Control control, ObjectRef value)
JSHeapBroker * broker() const
Node * BuildCheckSmi(Node *value, Effect *effect, Control control, FeedbackSource feedback_source=FeedbackSource())
Node * BuildCheckNumber(Node *value, Effect *effect, Control control, FeedbackSource feedback_source=FeedbackSource())
bool TryBuildStringCheck(JSHeapBroker *broker, ZoneVector< MapRef > const &maps, Node **receiver, Effect *effect, Control control)
void BuildCheckMaps(Node *object, Effect *effect, Control control, ZoneVector< MapRef > const &maps, bool has_deprecated_map_without_migration_target=false)
Isolate * isolate() const
std::optional< Node * > FoldLoadDictPrototypeConstant(PropertyAccessInfo const &access_info)
Node * BuildLoadDataField(NameRef name, PropertyAccessInfo const &access_info, Node *lookup_start_object, Node **effect, Node **control)
Representation field_representation() const
ConstFieldInfo GetConstFieldInfo() const
bool IsDictionaryProtoDataConstant() const
InternalIndex dictionary_index() const
OptionalJSObjectRef holder() const
FieldIndex field_index() const
ZoneVector< MapRef > const & lookup_start_object_maps() const
bool IsFastDataConstant() const
OptionalMapRef field_map() const
Node * NewNode(const Operator *op, int input_count, Node *const *inputs, bool incomplete=false)
static Type For(MapRef type, JSHeapBroker *broker)
#define V8_DICT_PROPERTY_CONST_TRACKING_BOOL
bool HasOnlyNonResizableTypedArrayMaps(JSHeapBroker *broker, ZoneVector< MapRef > const &maps)
bool HasOnlyStringMaps(JSHeapBroker *broker, ZoneVector< MapRef > const &maps)
@ kTryMigrateInstanceAndDeopt
bool HasOnlyStringWrapperMaps(JSHeapBroker *broker, ZoneVector< MapRef > const &maps)
ref_traits< T >::ref_type MakeRefAssumeMemoryFence(JSHeapBroker *broker, Tagged< T > object)
bool IsRabGsabTypedArrayElementsKind(ElementsKind kind)
@ SLOW_STRING_WRAPPER_ELEMENTS
@ FAST_STRING_WRAPPER_ELEMENTS
#define DCHECK(condition)
ConstFieldInfo const_field_info