39 if (IsJSReceiverMap(*
this)) {
47 return constructor_function->initial_map();
57 int const constructor_function_index = map->GetConstructorFunctionIndex();
68 const int instance_type = map->instance_type();
74 return kVisitSeqOneByteString;
76 return kVisitSeqTwoByteString;
81 return kVisitShortcutCandidate;
83 return kVisitConsString;
87 return kVisitSlicedString;
90 return kVisitExternalString;
93 return kVisitThinString;
98 if (InstanceTypeChecker::IsJSApiObject(map->instance_type())) {
99 return kVisitJSApiObject;
102 switch (instance_type) {
105 case FREE_SPACE_TYPE:
106 return kVisitFreeSpace;
108 case EMBEDDER_DATA_ARRAY_TYPE:
109 return kVisitEmbedderDataArray;
111 case NAME_TO_INDEX_HASH_TABLE_TYPE:
112 case REGISTERED_SYMBOL_TABLE_TYPE:
113 case HASH_TABLE_TYPE:
114 case ORDERED_HASH_MAP_TYPE:
115 case ORDERED_HASH_SET_TYPE:
116 case ORDERED_NAME_DICTIONARY_TYPE:
117 case NAME_DICTIONARY_TYPE:
118 case GLOBAL_DICTIONARY_TYPE:
119 case NUMBER_DICTIONARY_TYPE:
120 case SIMPLE_NUMBER_DICTIONARY_TYPE:
121 return kVisitFixedArray;
123 case SLOPPY_ARGUMENTS_ELEMENTS_TYPE:
124 return kVisitSloppyArgumentsElements;
126 case AWAIT_CONTEXT_TYPE:
127 case BLOCK_CONTEXT_TYPE:
128 case CATCH_CONTEXT_TYPE:
129 case DEBUG_EVALUATE_CONTEXT_TYPE:
130 case EVAL_CONTEXT_TYPE:
131 case FUNCTION_CONTEXT_TYPE:
132 case MODULE_CONTEXT_TYPE:
133 case SCRIPT_CONTEXT_TYPE:
134 case WITH_CONTEXT_TYPE:
135 return kVisitContext;
137 case NATIVE_CONTEXT_TYPE:
138 return kVisitNativeContext;
140 case EPHEMERON_HASH_TABLE_TYPE:
141 return kVisitEphemeronHashTable;
143 case PROPERTY_ARRAY_TYPE:
144 return kVisitPropertyArray;
146 case FEEDBACK_CELL_TYPE:
147 return kVisitFeedbackCell;
149 case FEEDBACK_METADATA_TYPE:
150 return kVisitFeedbackMetadata;
153 return kVisitOddball;
164 case PROPERTY_CELL_TYPE:
165 return kVisitPropertyCell;
167 case CONTEXT_SIDE_PROPERTY_CELL_TYPE:
168 return kVisitContextSidePropertyCell;
170 case TRANSITION_ARRAY_TYPE:
171 return kVisitTransitionArray;
173 case JS_WEAK_MAP_TYPE:
174 case JS_WEAK_SET_TYPE:
175 return kVisitJSWeakCollection;
177 case ACCESSOR_INFO_TYPE:
178 return kVisitAccessorInfo;
180 case INTERCEPTOR_INFO_TYPE:
181 return kVisitInterceptorInfo;
183 case FUNCTION_TEMPLATE_INFO_TYPE:
184 return kVisitFunctionTemplateInfo;
186 case OBJECT_TEMPLATE_INFO_TYPE:
195 case JS_ARRAY_BUFFER_TYPE:
196 return kVisitJSArrayBuffer;
198 case JS_DATA_VIEW_TYPE:
199 case JS_RAB_GSAB_DATA_VIEW_TYPE:
200 return kVisitJSDataViewOrRabGsabDataView;
202 case JS_EXTERNAL_OBJECT_TYPE:
203 return kVisitJSExternalObject;
205 case JS_FUNCTION_TYPE:
206 case JS_CLASS_CONSTRUCTOR_TYPE:
207 case JS_PROMISE_CONSTRUCTOR_TYPE:
208 case JS_REG_EXP_CONSTRUCTOR_TYPE:
209 case JS_ARRAY_CONSTRUCTOR_TYPE:
210#define TYPED_ARRAY_CONSTRUCTORS_SWITCH(Type, type, TYPE, Ctype) \
211 case TYPE##_TYPED_ARRAY_CONSTRUCTOR_TYPE:
213#undef TYPED_ARRAY_CONSTRUCTORS_SWITCH
214 return kVisitJSFunction;
216 case JS_TYPED_ARRAY_TYPE:
217 return kVisitJSTypedArray;
219 case SMALL_ORDERED_HASH_MAP_TYPE:
220 return kVisitSmallOrderedHashMap;
222 case SMALL_ORDERED_HASH_SET_TYPE:
223 return kVisitSmallOrderedHashSet;
225 case SMALL_ORDERED_NAME_DICTIONARY_TYPE:
226 return kVisitSmallOrderedNameDictionary;
228 case SWISS_NAME_DICTIONARY_TYPE:
229 return kVisitSwissNameDictionary;
231 case SHARED_FUNCTION_INFO_TYPE:
232 return kVisitSharedFunctionInfo;
234 case PREPARSE_DATA_TYPE:
235 return kVisitPreparseData;
237 case COVERAGE_INFO_TYPE:
238 return kVisitCoverageInfo;
242 case JS_PROMISE_TYPE: {
243 const bool has_raw_data_fields =
245 return has_raw_data_fields ? kVisitJSObject : kVisitJSObjectFast;
250 case JS_ARGUMENTS_OBJECT_TYPE:
251 case JS_ARRAY_ITERATOR_PROTOTYPE_TYPE:
252 case JS_ARRAY_ITERATOR_TYPE:
254 case JS_ASYNC_DISPOSABLE_STACK_TYPE:
255 case JS_ASYNC_FROM_SYNC_ITERATOR_TYPE:
256 case JS_ASYNC_FUNCTION_OBJECT_TYPE:
257 case JS_ASYNC_GENERATOR_OBJECT_TYPE:
258 case JS_CONTEXT_EXTENSION_OBJECT_TYPE:
259 case JS_DISPOSABLE_STACK_BASE_TYPE:
261 case JS_GENERATOR_OBJECT_TYPE:
262 case JS_ITERATOR_FILTER_HELPER_TYPE:
263 case JS_ITERATOR_MAP_HELPER_TYPE:
264 case JS_ITERATOR_TAKE_HELPER_TYPE:
265 case JS_ITERATOR_DROP_HELPER_TYPE:
266 case JS_ITERATOR_FLAT_MAP_HELPER_TYPE:
267 case JS_ITERATOR_PROTOTYPE_TYPE:
268 case JS_MAP_ITERATOR_PROTOTYPE_TYPE:
269 case JS_MAP_KEY_ITERATOR_TYPE:
270 case JS_MAP_KEY_VALUE_ITERATOR_TYPE:
272 case JS_MAP_VALUE_ITERATOR_TYPE:
273 case JS_MESSAGE_OBJECT_TYPE:
274 case JS_MODULE_NAMESPACE_TYPE:
275 case JS_OBJECT_PROTOTYPE_TYPE:
277 case JS_PRIMITIVE_WRAPPER_TYPE:
278 case JS_PROMISE_PROTOTYPE_TYPE:
279 case JS_REG_EXP_PROTOTYPE_TYPE:
280 case JS_REG_EXP_STRING_ITERATOR_TYPE:
281 case JS_SET_ITERATOR_PROTOTYPE_TYPE:
282 case JS_SET_KEY_VALUE_ITERATOR_TYPE:
283 case JS_SET_PROTOTYPE_TYPE:
285 case JS_SET_VALUE_ITERATOR_TYPE:
286 case JS_SYNC_DISPOSABLE_STACK_TYPE:
287 case JS_SHADOW_REALM_TYPE:
288 case JS_SHARED_ARRAY_TYPE:
289 case JS_SHARED_STRUCT_TYPE:
290 case JS_STRING_ITERATOR_PROTOTYPE_TYPE:
291 case JS_STRING_ITERATOR_TYPE:
292 case JS_TEMPORAL_CALENDAR_TYPE:
293 case JS_TEMPORAL_DURATION_TYPE:
294 case JS_TEMPORAL_INSTANT_TYPE:
295 case JS_TEMPORAL_PLAIN_DATE_TYPE:
296 case JS_TEMPORAL_PLAIN_DATE_TIME_TYPE:
297 case JS_TEMPORAL_PLAIN_MONTH_DAY_TYPE:
298 case JS_TEMPORAL_PLAIN_TIME_TYPE:
299 case JS_TEMPORAL_PLAIN_YEAR_MONTH_TYPE:
300 case JS_TEMPORAL_TIME_ZONE_TYPE:
301 case JS_TEMPORAL_ZONED_DATE_TIME_TYPE:
302 case JS_TYPED_ARRAY_PROTOTYPE_TYPE:
303 case JS_VALID_ITERATOR_WRAPPER_TYPE:
304 case JS_RAW_JSON_TYPE:
305#ifdef V8_INTL_SUPPORT
306 case JS_V8_BREAK_ITERATOR_TYPE:
307 case JS_COLLATOR_TYPE:
308 case JS_DATE_TIME_FORMAT_TYPE:
309 case JS_DISPLAY_NAMES_TYPE:
310 case JS_DURATION_FORMAT_TYPE:
311 case JS_LIST_FORMAT_TYPE:
313 case JS_NUMBER_FORMAT_TYPE:
314 case JS_PLURAL_RULES_TYPE:
315 case JS_RELATIVE_TIME_FORMAT_TYPE:
316 case JS_SEGMENT_ITERATOR_TYPE:
317 case JS_SEGMENTER_TYPE:
318 case JS_SEGMENTS_TYPE:
320#if V8_ENABLE_WEBASSEMBLY
321 case WASM_EXCEPTION_PACKAGE_TYPE:
322 case WASM_MODULE_OBJECT_TYPE:
323 case WASM_VALUE_OBJECT_TYPE:
325 case JS_BOUND_FUNCTION_TYPE:
326 case JS_WRAPPED_FUNCTION_TYPE: {
328 return kVisitJSObjectFast;
330 case JS_REG_EXP_TYPE:
331 return kVisitJSRegExp;
336 case JS_API_OBJECT_TYPE:
337 case JS_GLOBAL_PROXY_TYPE:
338 case JS_GLOBAL_OBJECT_TYPE:
339 case JS_SPECIAL_API_OBJECT_TYPE:
340 return kVisitJSApiObject;
345 case JS_WEAK_REF_TYPE:
346 return kVisitJSWeakRef;
349 return kVisitWeakCell;
351 case JS_FINALIZATION_REGISTRY_TYPE:
352 return kVisitJSFinalizationRegistry;
354 case JS_ATOMICS_MUTEX_TYPE:
355 case JS_ATOMICS_CONDITION_TYPE:
356 return kVisitJSSynchronizationPrimitive;
358 case HEAP_NUMBER_TYPE:
359 return kVisitHeapNumber;
362 return kVisitForeign;
367 case ALLOCATION_SITE_TYPE:
368 return kVisitAllocationSite;
372 case PROMISE_FULFILL_REACTION_JOB_TASK_TYPE:
373 case PROMISE_REJECT_REACTION_JOB_TASK_TYPE:
374 case CALLABLE_TASK_TYPE:
375 case CALLBACK_TASK_TYPE:
376 case PROMISE_RESOLVE_THENABLE_JOB_TASK_TYPE:
377 case ACCESS_CHECK_INFO_TYPE:
378 case ACCESSOR_PAIR_TYPE:
379 case ALIASED_ARGUMENTS_ENTRY_TYPE:
380 case ALLOCATION_MEMENTO_TYPE:
381 case ARRAY_BOILERPLATE_DESCRIPTION_TYPE:
382 case ASYNC_GENERATOR_REQUEST_TYPE:
383 case BREAK_POINT_TYPE:
384 case BREAK_POINT_INFO_TYPE:
385 case CLASS_BOILERPLATE_TYPE:
386 case CLASS_POSITIONS_TYPE:
387 case ENUM_CACHE_TYPE:
388 case ERROR_STACK_DATA_TYPE:
389 case FUNCTION_TEMPLATE_RARE_DATA_TYPE:
390 case MODULE_REQUEST_TYPE:
391 case PROMISE_CAPABILITY_TYPE:
392 case PROMISE_REACTION_TYPE:
393 case PROPERTY_DESCRIPTOR_OBJECT_TYPE:
395 case SCRIPT_OR_MODULE_TYPE:
396 case SOURCE_TEXT_MODULE_INFO_ENTRY_TYPE:
397 case STACK_FRAME_INFO_TYPE:
398 case STACK_TRACE_INFO_TYPE:
399 case TEMPLATE_OBJECT_DESCRIPTION_TYPE:
401#if V8_ENABLE_WEBASSEMBLY
402 case ASM_WASM_DATA_TYPE:
403 case WASM_EXCEPTION_TAG_TYPE:
407 case PROTOTYPE_INFO_TYPE:
408 return kVisitPrototypeInfo;
410 case DEBUG_INFO_TYPE:
411 return kVisitDebugInfo;
413 case CALL_SITE_INFO_TYPE:
414 return kVisitCallSiteInfo;
416 case BYTECODE_WRAPPER_TYPE:
417 return kVisitBytecodeWrapper;
419 case CODE_WRAPPER_TYPE:
420 return kVisitCodeWrapper;
422 case REG_EXP_BOILERPLATE_DESCRIPTION_TYPE:
423 return kVisitRegExpBoilerplateDescription;
425 case REG_EXP_DATA_WRAPPER_TYPE:
426 return kVisitRegExpDataWrapper;
428 case LOAD_HANDLER_TYPE:
429 case STORE_HANDLER_TYPE:
430 return kVisitDataHandler;
432 case SOURCE_TEXT_MODULE_TYPE:
433 return kVisitSourceTextModule;
434 case SYNTHETIC_MODULE_TYPE:
435 return kVisitSyntheticModule;
437#if V8_ENABLE_WEBASSEMBLY
438 case WASM_ARRAY_TYPE:
439 return kVisitWasmArray;
440 case WASM_MEMORY_MAP_DESCRIPTOR_TYPE:
441 return kVisitWasmMemoryMapDescriptor;
442 case WASM_FUNC_REF_TYPE:
443 return kVisitWasmFuncRef;
444 case WASM_GLOBAL_OBJECT_TYPE:
445 return kVisitWasmGlobalObject;
446 case WASM_INSTANCE_OBJECT_TYPE:
447 return kVisitWasmInstanceObject;
448 case WASM_MEMORY_OBJECT_TYPE:
449 return kVisitWasmMemoryObject;
451 return kVisitWasmNull;
452 case WASM_RESUME_DATA_TYPE:
453 return kVisitWasmResumeData;
454 case WASM_STRUCT_TYPE:
455 return kVisitWasmStruct;
456 case WASM_SUSPENDER_OBJECT_TYPE:
457 return kVisitWasmSuspenderObject;
458 case WASM_SUSPENDING_OBJECT_TYPE:
459 return kVisitWasmSuspendingObject;
460 case WASM_TABLE_OBJECT_TYPE:
461 return kVisitWasmTableObject;
462 case WASM_TAG_OBJECT_TYPE:
463 return kVisitWasmTagObject;
464 case WASM_TYPE_INFO_TYPE:
465 return kVisitWasmTypeInfo;
468#define MAKE_TQ_CASE(TYPE, Name) \
471 TORQUE_INSTANCE_TYPE_TO_BODY_DESCRIPTOR_LIST(
MAKE_TQ_CASE)
474#define CASE(TypeCamelCase, TYPE_UPPER_CASE) \
475 case TYPE_UPPER_CASE##_TYPE: \
476 return kVisit##TypeCamelCase;
481 std::string name =
ToString(map->instance_type());
482 FATAL(
"Instance type %s (code %d) not mapped to VisitorId.", name.c_str(),
511 DCHECK(map->instance_descriptors(isolate)
512 ->Search(*name, map->NumberOfOwnDescriptors())
521 int index = map->NextFreePropertyIndex();
523 if (map->instance_type() == JS_CONTEXT_EXTENSION_OBJECT_TYPE) {
529 isolate, map->instance_type(), &representation, &type);
535 representation, wrapped_type);
537 new_map->AccountAddedPropertyField();
561 int target_number_of_fields = target->NumberOfFields(cmode);
562 int target_inobject = target->GetInObjectProperties();
563 int target_unused = target->UnusedPropertyFields();
564 int old_number_of_fields;
567 target_inobject, target_unused,
568 &old_number_of_fields, cmode);
572 int target_number_of_fields,
573 int target_inobject,
int target_unused,
574 int* old_number_of_fields,
578 DCHECK(target_number_of_fields >= *old_number_of_fields);
579 if (target_number_of_fields != *old_number_of_fields)
return true;
587 : target->instance_descriptors();
589 if (new_desc->GetDetails(
i).representation().IsDouble() !=
590 old_desc->GetDetails(
i).representation().IsDouble()) {
602 if (target_number_of_fields <= target_inobject) {
603 DCHECK(target_number_of_fields + target_unused == target_inobject);
624 int mutable_count = 0;
647 transitions.ForEachTransition(
648 &no_gc, [&](
Tagged<Map> map) { map->DeprecateTransitionTree(isolate); },
650 if (
v8_flags.move_prototype_transitions_first) {
651 map->DeprecateTransitionTree(isolate);
657 set_is_deprecated(
true);
673 IsUndefined(GetBackPointer(cage_base), isolate)) {
682#ifndef V8_DISABLE_WRITE_BARRIERS
684 to_replace->number_of_descriptors());
686 while (current->instance_descriptors(cage_base) == to_replace) {
688 if (!current->TryGetBackPointer(cage_base, &next)) {
692 current->UpdateDescriptors(isolate, new_descriptors,
693 current->NumberOfOwnDescriptors());
696 set_owns_descriptors(
false);
704 if (!
result->TryGetBackPointer(cage_base, &parent)) {
709 ->number_of_descriptors());
721 ->GetDetails(descriptor)
726 if (!
result->TryGetBackPointer(cage_base, &parent))
break;
727 if (parent->NumberOfOwnDescriptors() <= descriptor.
as_int())
break;
741 }
while (!target.is_null() && target->is_deprecated());
742 if (target.is_null())
return Map();
753 DisallowDeoptimization no_deoptimization(isolate);
755 if (!old_map->is_deprecated())
return old_map;
758 Tagged<Map> target_map = SearchMigrationTarget(isolate, *old_map);
760 return handle(target_map, isolate);
770 return handle(new_map.value(), isolate);
779 const int old_nof = old_map->NumberOfOwnDescriptors();
794 new_map = transition;
828 old_descriptors->GetStrongValue(
i) !=
829 new_descriptors->GetStrongValue(
i)) {
834 if (new_map->NumberOfOwnDescriptors() != old_nof)
return Map();
840 if (!map->is_deprecated())
return map;
842 Tagged<Map> target_map = SearchMigrationTarget(isolate, *map);
853 CHECK(map->owns_descriptors());
857 int old_size = map->NumberOfOwnDescriptors();
858 if (slack <= descriptors->number_of_slack_descriptors())
return;
865 map->UpdateDescriptors(isolate, *new_descriptors,
866 map->NumberOfOwnDescriptors());
875 new_descriptors->CopyEnumCacheFrom(*descriptors);
880#ifndef V8_DISABLE_WRITE_BARRIERS
882 descriptors->number_of_descriptors());
887 map->UpdateDescriptors(isolate, *new_descriptors,
888 map->NumberOfOwnDescriptors());
890 if (IsUndefined(next, isolate))
return;
893 while (current->instance_descriptors(isolate) == *descriptors) {
894 next = current->GetBackPointer();
895 if (IsUndefined(next, isolate))
break;
896 current->UpdateDescriptors(isolate, *new_descriptors,
897 current->NumberOfOwnDescriptors());
906 isolate->native_context()->object_function()->initial_map(), isolate);
907 if (map->prototype() == *prototype)
return map;
908 if (
IsNull(*prototype, isolate)) {
909 return isolate->slow_object_with_null_prototype_map();
913 if (!js_prototype->map()->is_prototype_map()) {
920 if (info->ObjectCreateMap().GetHeapObjectIfWeak(&map_obj)) {
936 DCHECK(IsUndefined(from->GetBackPointer()));
940 if (!js_prototype->map()->is_prototype_map()) {
947 if (info->GetDerivedMap(from).GetHeapObjectIfWeak(&map_obj)) {
951 map->set_new_target_is_base(
false);
952 if (map->prototype() != *prototype) {
969 if (!current.is_null() && *current == map)
return true;
976 if (!current.is_null() && current->elements_kind() == elements_kind)
997 root_map = root_map->LookupElementsTransitionMap(isolate,
kind, cmode);
1002 for (root_map = root_map->ElementsTransitionMap(isolate, cmode);
1003 !root_map.
is_null() && root_map->has_fast_elements();
1004 root_map = root_map->ElementsTransitionMap(isolate, cmode)) {
1009 root_map->TryReplayPropertyTransitions(isolate, *
this, cmode);
1010 if (current.is_null())
continue;
1013 const bool current_is_packed =
1016 (is_packed || !current_is_packed)) {
1018 is_packed = is_packed && current_is_packed;
1031 DCHECK_EQ(map->FindRootMap(isolate)->NumberOfOwnDescriptors(),
1032 map->NumberOfOwnDescriptors());
1036 while (
kind != to_kind) {
1037 Tagged<Map> next_map = current_map->ElementsTransitionMap(isolate, cmode);
1038 if (next_map.
is_null())
return current_map;
1039 kind = next_map->elements_kind();
1040 current_map = next_map;
1043 DCHECK_EQ(to_kind, current_map->elements_kind());
1052 if (to_map->elements_kind() == to_kind)
return to_map;
1057 if (isolate->initial_array_prototype()->map() == *
this) {
1061 if (isolate->initial_object_prototype()->map() == *
this) {
1072 if (from_kind == to_kind)
return map;
1097 if (IsMap(maybe_transitioned_map)) {
1103 DCHECK(!IsUndefined(*map, isolate));
1108 allow_store_transition =
1113 if (!allow_store_transition) {
1129 if (map->IsDetached(isolate)) {
1143 if (
kind != to_kind) {
1147 DCHECK(current_map->elements_kind() == to_kind);
1158 if (closest_map->elements_kind() !=
kind)
return {};
1170 if (closest_map->elements_kind() ==
kind) {
1193 for (
int i = number_of_own_descriptors - 1;
i >= 0; --
i) {
1222 ElementsKind elements_kind = current->GetElementsKind(isolate);
1229 current->element_dictionary(isolate)->requires_slow_elements()) {
1247 int instance_size,
int inobject_properties) {
1249 src_handle, src_handle->instance_type(), instance_size,
1258 raw->set_constructor_or_back_pointer(src->GetConstructorRaw());
1259 raw->set_bit_field(src->bit_field());
1260 raw->set_bit_field2(src->bit_field2());
1261 int new_bit_field3 = src->bit_field3();
1262 new_bit_field3 = Bits3::OwnsDescriptorsBit::update(new_bit_field3,
true);
1264 Bits3::NumberOfOwnDescriptorsBits::update(new_bit_field3, 0);
1265 new_bit_field3 = Bits3::EnumLengthBits::update(new_bit_field3,
1267 new_bit_field3 = Bits3::IsDeprecatedBit::update(new_bit_field3,
false);
1269 Bits3::IsInRetainedMapListBit::update(new_bit_field3,
false);
1270 if (!src->is_dictionary_map()) {
1271 new_bit_field3 = Bits3::IsUnstableBit::update(new_bit_field3,
false);
1274 raw->set_bit_field3(new_bit_field3);
1275 raw->clear_padding();
1286 const char* reason) {
1287 DCHECK(!fast_map->is_dictionary_map());
1290 if (fast_map->is_prototype_map()) {
1296 meta_map->native_context()->normalized_map_cache();
1297 use_cache = !IsUndefined(normalized_map_cache, isolate);
1305 if (use_cache && cache
1306 ->
Get(isolate, fast_map, new_elements_kind,
1307 new_prototype.
is_null() ? fast_map->prototype()
1310 .ToHandle(&new_map)) {
1312 if (
v8_flags.verify_heap) new_map->DictionaryMapVerify(isolate);
1314#ifdef ENABLE_SLOW_DCHECKS
1315 if (
v8_flags.enable_slow_asserts) {
1320 fresh->set_elements_kind(new_elements_kind);
1321 if (!new_prototype.
is_null()) {
1325 static_assert(Map::kPrototypeValidityCellOffset ==
1328 reinterpret_cast<void*
>(new_map->
address()),
1329 Map::kBitField3Offset));
1335 constexpr int ignored_bit_field3_bits =
1336 Bits3::IsInRetainedMapListBit::kMask |
1337 Bits3::IsMigrationTargetBit::kMask;
1338 DCHECK_EQ(fresh->bit_field3() & ~ignored_bit_field3_bits,
1339 new_map->bit_field3() & ~ignored_bit_field3_bits);
1343 Map::kDependentCodeOffset -
offset));
1345 if (new_map->is_prototype_map()) {
1347 static_assert(Map::kTransitionsOrPrototypeInfoOffset ==
1358 LOG(isolate, MapEvent(
"NormalizeCached", fast_map, new_map, reason));
1362 new_map->set_elements_kind(new_elements_kind);
1363 if (!new_prototype.
is_null()) {
1365 DCHECK(new_map->is_dictionary_map() && !new_map->is_deprecated());
1368 cache->Set(isolate, fast_map, new_map);
1371 LOG(isolate, MapEvent(
"Normalize", fast_map, new_map, reason));
1374 fast_map->NotifyLeafMapLayoutChange(isolate);
1380 int new_instance_size = map->instance_size();
1382 new_instance_size -= map->GetInObjectProperties() *
kTaggedSize;
1386 isolate, map, new_instance_size,
1393 raw->SetInObjectUnusedPropertyFields(0);
1394 raw->set_is_dictionary_map(
true);
1395 raw->set_is_migration_target(
false);
1396 raw->set_may_have_interesting_properties(
true);
1416 new_map->set_is_immutable_proto(
true);
1424 DCHECK((IsJSFunction(maybe_constructor) &&
1431 *map == *isolate->strict_function_map() ||
1432 *map == *isolate->strict_function_with_name_map() ||
1435 *map == *isolate->generator_function_with_name_map() ||
1438 *map == *isolate->async_function_with_name_map());
1442 DCHECK_EQ(map->NumberOfOwnDescriptors(),
1443 map->instance_descriptors(isolate)->number_of_descriptors());
1450 EnsureInitialMap(isolate, map);
1456 int instance_size,
int inobject_properties,
1457 int unused_property_fields) {
1458 EnsureInitialMap(isolate, map);
1461 RawCopy(isolate, map, instance_size, inobject_properties);
1464 result->SetInObjectUnusedPropertyFields(unused_property_fields);
1466 int number_of_own_descriptors = map->NumberOfOwnDescriptors();
1467 if (number_of_own_descriptors > 0) {
1470 result->set_owns_descriptors(
false);
1471 result->UpdateDescriptors(isolate, descriptors, number_of_own_descriptors);
1474 result->GetInObjectProperties() -
result->UnusedPropertyFields());
1482 RawCopy(isolate, map, map->instance_size(),
1483 IsJSObjectMap(*map) ? map->GetInObjectProperties() : 0);
1486 if (IsJSObjectMap(*map)) {
1487 result->CopyUnusedPropertyFields(*map);
1489 map->NotifyLeafMapLayoutChange(isolate);
1499 DCHECK_EQ(map->NumberOfOwnDescriptors(),
1500 map->instance_descriptors(isolate)->number_of_descriptors());
1506 if (name->IsInteresting(isolate)) {
1507 result->set_may_have_interesting_properties(
true);
1511 if (descriptors->number_of_slack_descriptors() == 0) {
1512 int old_size = descriptors->number_of_descriptors();
1513 if (old_size == 0) {
1518 descriptors =
direct_handle(map->instance_descriptors(isolate), isolate);
1524 descriptors->Append(descriptor);
1525 result->InitializeDescriptors(isolate, *descriptors);
1528 DCHECK(
result->NumberOfOwnDescriptors() == map->NumberOfOwnDescriptors() + 1);
1537 bool force_connect) {
1540 child->may_have_interesting_properties());
1542 child->may_have_interesting_properties());
1543 if (!IsUndefined(parent->GetBackPointer(), isolate)) {
1544 parent->set_owns_descriptors(
false);
1545 }
else if (!parent->IsDetached(isolate)) {
1548 DCHECK_EQ(parent->NumberOfOwnDescriptors(),
1549 parent->instance_descriptors(isolate)->number_of_descriptors());
1551 if (parent->IsDetached(isolate) && !force_connect) {
1552 DCHECK(child->IsDetached(isolate));
1554 LOG(isolate, MapEvent(
"Transition", parent, child,
"prototype", name));
1559 LOG(isolate, MapEvent(
"Transition", parent, child,
"", name));
1569 DCHECK(descriptors->IsSortedNoDuplicates());
1572 bool is_connected =
false;
1576 if (maybe_name.
ToHandle(&name) && name->IsInteresting(isolate)) {
1577 result->set_may_have_interesting_properties(
true);
1580 if (map->is_prototype_map()) {
1581 result->InitializeDescriptors(isolate, *descriptors);
1585 result->InitializeDescriptors(isolate, *descriptors);
1589 is_connected =
true;
1591 v8_flags.move_prototype_transitions_first) ||
1592 isolate->bootstrapper()->IsActive()) {
1597 IsUndefined(map->GetBackPointer()));
1598 result->InitializeDescriptors(isolate, *descriptors);
1601 !
v8_flags.move_prototype_transitions_first);
1603 result->InitializeDescriptors(isolate, *descriptors);
1606 if (
v8_flags.log_maps && !is_connected) {
1608 MapEvent(
"ReplaceDescriptors", map,
result, reason,
1621 DCHECK(descriptors->IsSortedNoDuplicates());
1622 int split_nof = split_map->NumberOfOwnDescriptors();
1623 int nof_descriptors = descriptors->number_of_descriptors();
1624 CHECK_LT(split_nof, nof_descriptors);
1636 last_map->InitializeDescriptors(isolate, *descriptors);
1637 last_map->SetInObjectUnusedPropertyFields(0);
1638 last_map->set_may_have_interesting_properties(
true);
1652 DCHECK_EQ(*new_map->GetBackPointer(), *map);
1655 map->NotifyLeafMapLayoutChange(isolate);
1656 last_map->set_may_have_interesting_properties(
false);
1668 bool force_connect) {
1669 DCHECK(descriptors->IsSortedNoDuplicates());
1671 child->SetInstanceDescriptors(isolate, *descriptors,
1672 new_descriptor.
as_int() + 1);
1673 child->CopyUnusedPropertyFields(*parent);
1676 child->AccountAddedPropertyField();
1680 if (parent->may_have_interesting_properties() ||
1681 name->IsInteresting(isolate)) {
1682 child->set_may_have_interesting_properties(
true);
1692 DCHECK(IsJSObjectMap(*map));
1694 !map->CanHaveFastTransitionableElementsKind(),
1700 DCHECK_EQ(map->FindRootMap(isolate)->NumberOfOwnDescriptors(),
1701 map->NumberOfOwnDescriptors());
1703 maybe_elements_transition_map =
1706 (maybe_elements_transition_map->elements_kind() ==
1714 bool insert_transition =
1717 maybe_elements_transition_map.
is_null();
1719 if (insert_transition) {
1721 new_map->set_elements_kind(
kind);
1730 new_map->set_elements_kind(
kind);
1737 DCHECK(InstanceTypeChecker::IsJSFunction(initial_map->instance_type()));
1741 if (
is_sloppy(shared_info->language_mode()))
return initial_map;
1744 shared_info->function_map_index())),
1750 isolate->factory()->strict_function_transition_symbol();
1752 isolate, initial_map, *transition_symbol);
1753 if (!maybe_transition.
is_null()) {
1756 initial_map->NotifyLeafMapLayoutChange(isolate);
1762 initial_map->GetInObjectProperties(),
1763 initial_map->UnusedPropertyFields());
1764 map->SetConstructor(initial_map->GetConstructor());
1765 map->set_prototype(initial_map->prototype());
1766 map->set_construction_counter(initial_map->construction_counter());
1777 DCHECK(!map->IsDetached(isolate));
1778 DCHECK(!map->is_dictionary_map());
1781 if (map->owns_descriptors()) {
1785 map->set_owns_descriptors(
false);
1786 new_map->InitializeDescriptors(isolate, map->instance_descriptors(isolate));
1791 map->instance_descriptors(isolate), isolate);
1792 int number_of_own_descriptors = map->NumberOfOwnDescriptors();
1794 isolate, descriptors, number_of_own_descriptors);
1795 new_map->InitializeDescriptors(isolate, *new_descriptors);
1815 int number_of_own_descriptors = map->NumberOfOwnDescriptors();
1817 isolate, descriptors, number_of_own_descriptors);
1827 direct_handle(isolate->object_function()->initial_map(), isolate),
1839 int new_instance_size =
1840 JSObject::kHeaderSize +
kTaggedSize * inobject_properties;
1843 copy->set_instance_size(new_instance_size);
1844 copy->SetInObjectPropertiesStartInWords(JSObject::kHeaderSize /
kTaggedSize);
1845 DCHECK_EQ(copy->GetInObjectProperties(), inobject_properties);
1846 copy->SetInObjectUnusedPropertyFields(inobject_properties);
1855 bool old_map_is_dictionary_elements_kind) {
1856 int num_descriptors = map->NumberOfOwnDescriptors();
1859 isolate,
direct_handle(map->instance_descriptors(isolate), isolate),
1860 num_descriptors, attrs_to_add);
1867 new_map->set_is_extensible(
false);
1872 if (!old_map_is_dictionary_elements_kind) {
1873 switch (map->elements_kind()) {
1875 if (attrs_to_add ==
SEALED) {
1877 }
else if (attrs_to_add ==
FROZEN) {
1884 if (attrs_to_add ==
SEALED) {
1886 }
else if (attrs_to_add ==
FROZEN) {
1891 if (attrs_to_add ==
FROZEN) {
1896 if (attrs_to_add ==
SEALED) {
1898 }
else if (attrs_to_add ==
FROZEN) {
1905 if (attrs_to_add ==
SEALED) {
1907 }
else if (attrs_to_add ==
FROZEN) {
1912 if (attrs_to_add ==
FROZEN) {
1920 new_map->set_elements_kind(new_kind);
1950DirectHandle<Map> UpdateDescriptorForValue(Isolate* isolate,
1951 DirectHandle<Map> map,
1952 InternalIndex descriptor,
1954 DirectHandle<Object> value) {
1955 if (CanHoldValue(map->instance_descriptors(isolate), descriptor, constness,
1961 map->instance_descriptors(isolate)->GetDetails(descriptor).attributes();
1962 Representation representation =
1964 DirectHandle<FieldType> type =
1967 MapUpdater
mu(isolate, map);
1968 return mu.ReconfigureToDataField(descriptor, attributes, constness,
1969 representation, type);
1981 DCHECK(!map->is_deprecated());
1983 DCHECK(!map->is_dictionary_map());
1984 return UpdateDescriptorForValue(isolate, map, descriptor, constness, value);
1992 map->IsDetached(isolate)
1993 ? RuntimeCallCounterId::kPrototypeMap_TransitionToDataProperty
1994 : RuntimeCallCounterId::kMap_TransitionToDataProperty);
1997 DCHECK(!map->is_dictionary_map());
2000 map =
Update(isolate, map);
2005 if (maybe_transition.
ToHandle(&transition)) {
2008 DCHECK_EQ(attributes, transition->instance_descriptors(isolate)
2009 ->GetDetails(descriptor)
2012 return UpdateDescriptorForValue(isolate, transition, descriptor, constness,
2020 if (!map->TooManyFastProperties(store_origin)) {
2026 constness, representation, flag);
2031 const char* reason =
"TooManyFastProperties";
2033 std::unique_ptr<base::ScopedVector<char>> buffer;
2036 name->NameShortPrint(name_buffer);
2038 SNPrintF(*buffer,
"TooManyFastProperties %s", name_buffer.
begin());
2039 reason = buffer->begin();
2043 if (
v8_flags.feedback_normalization && map->new_target_is_base() &&
2044 IsJSFunction(*maybe_constructor) &&
2047 DCHECK_NE(*constructor, constructor->native_context()->object_function());
2051 initial_map->DeprecateTransitionTree(isolate);
2059 if (!
result->EquivalentToForNormalization(*map,
2078 map->IsDetached(isolate)
2079 ? RuntimeCallCounterId::kPrototypeMap_TransitionToAccessorProperty
2080 : RuntimeCallCounterId::kMap_TransitionToAccessorProperty);
2087 map =
Update(isolate, map);
2090 if (map->is_dictionary_map())
return map;
2100 if (maybe_transition.
ToHandle(&transition)) {
2102 transition->instance_descriptors(isolate);
2104 DCHECK(descriptors->GetKey(last_descriptor)->Equals(*name));
2107 descriptors->GetDetails(last_descriptor).kind());
2109 descriptors->GetDetails(last_descriptor).attributes());
2112 descriptors->GetStrongValue(last_descriptor), isolate);
2113 if (!IsAccessorPair(*maybe_pair)) {
2115 "TransitionToAccessorFromNonPair");
2121 "TransitionToDifferentAccessor");
2130 if (descriptor != map->LastAdded()) {
2131 return Map::Normalize(isolate, map, mode,
"AccessorsOverwritingNonLast");
2133 PropertyDetails old_details = old_descriptors->GetDetails(descriptor);
2136 "AccessorsOverwritingNonAccessors");
2139 if (old_details.
attributes() != attributes) {
2140 return Map::Normalize(isolate, map, mode,
"AccessorsWithAttributes");
2145 if (!IsAccessorPair(*maybe_pair)) {
2146 return Map::Normalize(isolate, map, mode,
"AccessorsOverwritingNonPair");
2152 bool overwriting_accessor =
false;
2156 overwriting_accessor =
true;
2161 overwriting_accessor =
true;
2163 if (overwriting_accessor) {
2165 "AccessorsOverwritingAccessors");
2172 "TooManyAccessors");
2174 pair = isolate->factory()->NewAccessorPair();
2194 !IsUndefined(map->GetBackPointer(), isolate) &&
2199 int nof = map->NumberOfOwnDescriptors();
2202 new_descriptors->Append(descriptor);
2205 descriptor->
GetKey(),
"CopyAddDescriptor",
2213 map->instance_descriptors(isolate), isolate);
2217 old_descriptors->SearchWithCache(isolate, *descriptor->
GetKey(), *map);
2218 if (index.is_found()) {
2235 descriptors->GetDetails(insertion_index).location());
2238 isolate, descriptors, map->NumberOfOwnDescriptors());
2240 new_descriptors->Replace(insertion_index, descriptor);
2243 (insertion_index.
as_int() == descriptors->number_of_descriptors() - 1)
2247 "CopyReplaceDescriptor", simple_flag);
2260 prototype_hash =
receiver->GetOrCreateIdentityHash(isolate).value();
2268bool CheckEquivalentModuloProto(
const Tagged<Map> first,
2270 return first->GetConstructorRaw() ==
second->GetConstructorRaw() &&
2271 first->instance_type() ==
second->instance_type() &&
2272 first->bit_field() ==
second->bit_field() &&
2273 first->is_extensible() ==
second->is_extensible() &&
2274 first->new_target_is_base() ==
second->new_target_is_base();
2282 CHECK_EQ(GetConstructor(), other->GetConstructor());
2283 CHECK_EQ(instance_type(), other->instance_type());
2285 if (
bit_field() != other->bit_field())
return false;
2286 if (new_prototype.
is_null()) {
2287 if (
prototype() != other->prototype())
return false;
2289 if (*new_prototype != other->prototype())
return false;
2291 if (new_target_is_base() != other->new_target_is_base())
return false;
2292 if (InstanceTypeChecker::IsJSFunction(instance_type())) {
2302 : other->instance_descriptors();
2303 return this_descriptors->IsEqualUpTo(that_descriptors, nof);
2324 descriptors->GetFieldType(
i)));
2339 Map::Bits2::ElementsKindBits::decode(
bit_field2()));
2340 int adjusted_other_bit_field2 =
2341 Map::Bits2::ElementsKindBits::update(other->bit_field2(), elements_kind);
2342 return CheckEquivalentModuloProto(*
this, other) &&
2352 DCHECK(IsUndefined(GetBackPointer(), isolate));
2357 slack = std::min(slack, map->UnusedPropertyFields());
2359 transitions.TraverseTransitionTree(
callback);
2365 int number_of_own_descriptors,
2369 set_instance_descriptors(descriptors,
kReleaseStore, barrier_mode);
2371#ifndef V8_DISABLE_WRITE_BARRIERS
2382 if (prototype->map()->TryGetPrototypeInfo(&prototype_info)) {
2387 isolate->factory()->NewPrototypeInfo();
2388 prototype->map()->set_prototype_info(*proto_info,
kReleaseStore);
2396 Tagged<Object> maybe_proto_info = prototype_map->prototype_info();
2401 DirectHandle<PrototypeInfo> proto_info =
2402 isolate->factory()->NewPrototypeInfo();
2403 prototype_map->set_prototype_info(*proto_info,
kReleaseStore);
2410 DCHECK(map->is_prototype_map());
2411 if (value ==
false && !map->has_prototype_info()) {
2422 if (IsJSGlobalObjectMap(*map)) {
2423 DCHECK(map->is_prototype_map());
2426 maybe_prototype = isolate->global_object();
2429 map->GetPrototypeChainRootMap(isolate)->prototype(), isolate);
2441 prototype->map()->prototype_validity_cell(
kRelaxedLoad);
2443 if (IsCell(maybe_cell)) {
2446 return handle(cell, isolate);
2451 prototype->map()->set_prototype_validity_cell(*cell,
kRelaxedStore);
2457 DCHECK(map->is_prototype_map());
2459 if (IsCell(maybe_cell)) {
2469 bool enable_prototype_setup_mode) {
2470 RCS_SCOPE(isolate, RuntimeCallCounterId::kMap_SetPrototype);
2476 DCHECK(
IsNull(*prototype, isolate) || IsJSProxy(*prototype) ||
2483 map->set_prototype(*prototype, wb_mode);
2495 DCHECK(IsUndefined(map->GetBackPointer()));
2497 if (new_map->GetBackPointer() != *map &&
2498 map->IsInobjectSlackTrackingInProgress()) {
2501 map->InobjectSlackTrackingStep(isolate);
2511 IsUndefined(map->GetBackPointer()));
2513 isolate, *map, *prototype)) {
2514 new_map =
handle(*maybe_map, isolate);
2517 if (!map->IsDetached(isolate)) {
2523 new_map->IsInobjectSlackTrackingInProgress());
2525 map->construction_counter() <= new_map->construction_counter());
2544 if (!value.GetHeapObjectIfWeak(&heap_object)) {
2549 CHECK(normalized_map->is_dictionary_map());
2550 if (!normalized_map->EquivalentToForNormalization(*fast_map, elements_kind,
2554 return handle(normalized_map, isolate);
2560 DCHECK(normalized_map->is_dictionary_map());
#define SLOW_DCHECK(condition)
constexpr T * begin() const
static NEVER_READ_ONLY_SPACE DirectHandle< AccessorPair > Copy(Isolate *isolate, DirectHandle< AccessorPair > pair)
static int ArrayMapIndex(ElementsKind elements_kind)
@ kInitialMapChangedGroup
static void DeoptimizeDependencyGroups(Isolate *isolate, ObjectT object, DependencyGroups groups)
static DirectHandle< DescriptorArray > CopyUpToAddAttributes(Isolate *isolate, DirectHandle< DescriptorArray > desc, int enumeration_index, PropertyAttributes attributes, int slack=0)
static V8_EXPORT_PRIVATE Handle< DescriptorArray > Allocate(IsolateT *isolate, int nof_descriptors, int slack, AllocationType allocation=AllocationType::kYoung)
static DirectHandle< DescriptorArray > CopyUpTo(Isolate *isolate, DirectHandle< DescriptorArray > desc, int enumeration_index, int slack=0)
static Descriptor DataField(Isolate *isolate, DirectHandle< Name > key, int field_index, PropertyAttributes attributes, Representation representation)
DirectHandle< Name > GetKey() const
static Descriptor AccessorConstant(DirectHandle< Name > key, DirectHandle< Object > foreign, PropertyAttributes attributes)
PropertyDetails GetDetails() const
V8_INLINE bool is_null() const
V8_INLINE Address address() const
static Tagged< Map > AsClass(Tagged< FieldType > type)
static V8_EXPORT_PRIVATE Tagged< FieldType > Any()
static bool NowContains(Tagged< FieldType > type, Tagged< Object > value)
static bool NowIs(Tagged< FieldType > type, Tagged< FieldType > other)
V8_INLINE Address address() const
static V8_INLINE bool InWritableSharedSpace(Tagged< HeapObject > object)
static V8_INLINE bool InReadOnlySpace(Tagged< HeapObject > object)
constexpr int as_int() const
static void SetInitialMap(Isolate *isolate, DirectHandle< JSFunction > function, DirectHandle< Map > map, DirectHandle< JSPrototype > prototype)
static const int kMaxInObjectProperties
static void OptimizeAsPrototype(DirectHandle< JSObject > object, bool enable_setup_mode=true)
int GetEmbedderFieldCount() const
static void LazyRegisterPrototypeUser(DirectHandle< Map > user, Isolate *isolate)
DirectHandle< Map > ReconfigureElementsKind(ElementsKind elements_kind)
static std::optional< Tagged< Map > > TryUpdateNoLock(Isolate *isolate, Tagged< Map > old_map, ConcurrencyMode cmode) V8_WARN_UNUSED_RESULT
static Handle< Map > CopyForElementsTransition(Isolate *isolate, DirectHandle< Map > map)
static V8_EXPORT_PRIVATE Handle< Map > Create(Isolate *isolate, int inobject_properties)
static bool IsPrototypeChainInvalidated(Tagged< Map > map)
int NumberOfEnumerableProperties() const
InternalIndex::Range IterateOwnDescriptors() const
static std::optional< Tagged< JSFunction > > GetConstructorFunction(Tagged< Map > map, Tagged< Context > native_context)
int NumberOfFields(ConcurrencyMode cmode) const
static DirectHandle< PrototypeInfo > GetOrCreatePrototypeInfo(DirectHandle< Map > prototype_map, Isolate *isolate)
static V8_EXPORT_PRIVATE Handle< Map > TransitionToUpdatePrototype(Isolate *isolate, DirectHandle< Map > map, DirectHandle< JSPrototype > prototype)
static V8_EXPORT_PRIVATE void EnsureDescriptorSlack(Isolate *isolate, DirectHandle< Map > map, int slack)
bool EquivalentToForTransition(const Tagged< Map > other, ConcurrencyMode cmode, DirectHandle< HeapObject > new_prototype={}) const
static constexpr Tagged< Smi > kPrototypeChainValidSmi
static Handle< Map > CopyForPrototypeTransition(Isolate *isolate, DirectHandle< Map > map, DirectHandle< JSPrototype > prototype)
V8_EXPORT_PRIVATE static V8_WARN_UNUSED_RESULT MaybeHandle< Map > CopyWithConstant(Isolate *isolate, DirectHandle< Map > map, DirectHandle< Name > name, DirectHandle< Object > constant, PropertyAttributes attributes, TransitionFlag flag)
static V8_EXPORT_PRIVATE Handle< Map > CopyInsertDescriptor(Isolate *isolate, DirectHandle< Map > map, Descriptor *descriptor, TransitionFlag flag)
static DirectHandle< Map > GetObjectCreateMap(Isolate *isolate, DirectHandle< JSPrototype > prototype)
static const int kSlackTrackingCounterStart
static const int kNoSlackTracking
static Handle< Map > CopyDropDescriptors(Isolate *isolate, DirectHandle< Map > map)
static void SetShouldBeFastPrototypeMap(DirectHandle< Map > map, bool value, Isolate *isolate)
static Handle< UnionOf< Smi, Cell > > GetOrCreatePrototypeChainValidityCell(DirectHandle< Map > map, Isolate *isolate)
static Handle< Map > Copy(Isolate *isolate, DirectHandle< Map > map, const char *reason, TransitionKindFlag kind=SPECIAL_TRANSITION)
bool IsDetached(Isolate *isolate) const
bool IsInobjectSlackTrackingInProgress() const
bool EquivalentToForNormalization(const Tagged< Map > other, ElementsKind elements_kind, Tagged< HeapObject > prototype, PropertyNormalizationMode mode) const
static V8_EXPORT_PRIVATE DirectHandle< Map > TransitionToDataProperty(Isolate *isolate, DirectHandle< Map > map, DirectHandle< Name > name, DirectHandle< Object > value, PropertyAttributes attributes, PropertyConstness constness, StoreOrigin store_origin)
static void InstallDescriptors(Isolate *isolate, DirectHandle< Map > parent_map, DirectHandle< Map > child_map, InternalIndex new_descriptor, DirectHandle< DescriptorArray > descriptors, bool force_connect=false)
static DirectHandle< Map > AsLanguageMode(Isolate *isolate, DirectHandle< Map > initial_map, DirectHandle< SharedFunctionInfo > shared_info)
static V8_EXPORT_PRIVATE MaybeHandle< Map > TryUpdate(Isolate *isolate, Handle< Map > map) V8_WARN_UNUSED_RESULT
static MaybeObjectDirectHandle WrapFieldType(DirectHandle< FieldType > type)
static V8_EXPORT_PRIVATE DirectHandle< Map > PrepareForDataProperty(Isolate *isolate, DirectHandle< Map > old_map, InternalIndex descriptor_number, PropertyConstness constness, DirectHandle< Object > value)
void StartInobjectSlackTracking()
Tagged< Map > LookupElementsTransitionMap(Isolate *isolate, ElementsKind elements_kind, ConcurrencyMode cmode)
V8_EXPORT_PRIVATE Tagged< Map > FindRootMap(PtrComprCageBase cage_base) const
static V8_EXPORT_PRIVATE Handle< Map > TransitionRootMapToPrototypeForNewObject(Isolate *isolate, DirectHandle< Map > map, DirectHandle< JSPrototype > prototype)
static void ConnectTransition(Isolate *isolate, DirectHandle< Map > parent, DirectHandle< Map > child, DirectHandle< Name > name, TransitionKindFlag transition_kind, bool force_connect=false)
void SetNumberOfOwnDescriptors(int number)
bool IsMapInArrayPrototypeChain(Isolate *isolate) const
FieldCounts GetFieldCounts() const
static bool IsMostGeneralFieldType(Representation representation, Tagged< FieldType > field_type)
Tagged< Map > GetPrototypeChainRootMap(Isolate *isolate) const
int GetInObjectProperties() const
bool OnlyHasSimpleProperties() const
void ReplaceDescriptors(Isolate *isolate, Tagged< DescriptorArray > new_descriptors)
static Handle< Map > CopyAsElementsKind(Isolate *isolate, DirectHandle< Map > map, ElementsKind kind, TransitionFlag flag)
static Handle< Map > CopyAddDescriptor(Isolate *isolate, DirectHandle< Map > map, Descriptor *descriptor, TransitionFlag flag)
void DeprecateTransitionTree(Isolate *isolate)
static V8_EXPORT_PRIVATE void SetPrototype(Isolate *isolate, DirectHandle< Map > map, DirectHandle< JSPrototype > prototype, bool enable_prototype_setup_mode=true)
int ComputeMinObjectSlack(Isolate *isolate)
bool ShouldCheckForReadOnlyElementsInPrototypeChain(Isolate *isolate)
V8_EXPORT_PRIVATE void SetInstanceDescriptors(Isolate *isolate, Tagged< DescriptorArray > descriptors, int number_of_own_descriptors, WriteBarrierMode barrier_mode=UPDATE_WRITE_BARRIER)
bool EquivalentToForElementsKindTransition(const Tagged< Map > other, ConcurrencyMode cmode) const
V8_EXPORT_PRIVATE Tagged< Map > FindElementsKindTransitionedMap(Isolate *isolate, MapHandlesSpan candidates, ConcurrencyMode cmode)
static V8_EXPORT_PRIVATE Handle< Map > Normalize(Isolate *isolate, DirectHandle< Map > map, ElementsKind new_elements_kind, DirectHandle< JSPrototype > new_prototype, PropertyNormalizationMode mode, bool use_cache, const char *reason)
int Hash(Isolate *isolate, Tagged< HeapObject > prototype)
Tagged< UnionOf< Smi, MaybeWeak< Map >, TransitionArray > > Isolate * isolate
static V8_EXPORT_PRIVATE DirectHandle< Map > Update(Isolate *isolate, DirectHandle< Map > map)
static std::optional< Tagged< Map > > TryAsElementsKind(Isolate *isolate, DirectHandle< Map > map, ElementsKind kind, ConcurrencyMode cmode)
static V8_EXPORT_PRIVATE Tagged< FieldType > UnwrapFieldType(Tagged< MaybeObject > wrapped_type)
static V8_EXPORT_PRIVATE Handle< Map > CopyForPreventExtensions(Isolate *isolate, DirectHandle< Map > map, PropertyAttributes attrs_to_add, DirectHandle< Symbol > transition_marker, const char *reason, bool old_map_is_dictionary_elements_kind=false)
static Handle< Map > GetDerivedMap(Isolate *isolate, DirectHandle< Map > from, DirectHandle< JSReceiver > prototype)
static Handle< Map > CopyReplaceDescriptors(Isolate *isolate, DirectHandle< Map > map, DirectHandle< DescriptorArray > descriptors, TransitionFlag flag, MaybeDirectHandle< Name > maybe_name, const char *reason, TransitionKindFlag transition_kind)
static void GeneralizeIfCanHaveTransitionableFastElementsKind(Isolate *isolate, InstanceType instance_type, Representation *representation, DirectHandle< FieldType > *field_type)
static V8_EXPORT_PRIVATE VisitorId GetVisitorId(Tagged< Map > map)
static V8_EXPORT_PRIVATE Handle< Map > AsElementsKind(Isolate *isolate, DirectHandle< Map > map, ElementsKind kind)
static V8_EXPORT_PRIVATE Handle< Map > AddMissingTransitions(Isolate *isolate, DirectHandle< Map > map, DirectHandle< DescriptorArray > descriptors)
int NumberOfOwnDescriptors() const
static Handle< Map > CopyReplaceDescriptor(Isolate *isolate, DirectHandle< Map > map, DirectHandle< DescriptorArray > descriptors, Descriptor *descriptor, InternalIndex index, TransitionFlag flag)
static int SlackForArraySize(int old_size, int size_limit)
static Handle< Map > ShareDescriptor(Isolate *isolate, DirectHandle< Map > map, DirectHandle< DescriptorArray > descriptors, Descriptor *descriptor)
static Handle< Map > RawCopy(Isolate *isolate, DirectHandle< Map > map, int instance_size, int inobject_properties)
int GetConstructorFunctionIndex() const
V8_EXPORT_PRIVATE Tagged< Map > FindFieldOwner(PtrComprCageBase cage_base, InternalIndex descriptor) const
static Handle< Map > CopyNormalized(Isolate *isolate, DirectHandle< Map > map, PropertyNormalizationMode mode)
static DirectHandle< Map > TransitionElementsTo(Isolate *isolate, DirectHandle< Map > map, ElementsKind to_kind)
static DirectHandle< Map > CopyInitialMapNormalized(Isolate *isolate, DirectHandle< Map > map, PropertyNormalizationMode mode=CLEAR_INOBJECT_PROPERTIES)
V8_EXPORT_PRIVATE static V8_WARN_UNUSED_RESULT MaybeHandle< Map > CopyWithField(Isolate *isolate, DirectHandle< Map > map, DirectHandle< Name > name, DirectHandle< FieldType > type, PropertyAttributes attributes, PropertyConstness constness, Representation representation, TransitionFlag flag)
Tagged< Map > TryReplayPropertyTransitions(Isolate *isolate, Tagged< Map > map, ConcurrencyMode cmode)
bool InstancesNeedRewriting(Tagged< Map > target, ConcurrencyMode cmode) const
bool CanBeDeprecated() const
int UnusedPropertyFields() const
static DirectHandle< Map > TransitionToImmutableProto(Isolate *isolate, DirectHandle< Map > map)
int NextFreePropertyIndex() const
static V8_EXPORT_PRIVATE DirectHandle< Map > TransitionToAccessorProperty(Isolate *isolate, DirectHandle< Map > map, DirectHandle< Name > name, InternalIndex descriptor, DirectHandle< Object > getter, DirectHandle< Object > setter, PropertyAttributes attributes)
static const int kNoConstructorFunctionIndex
static Handle< Map > CopyInitialMap(Isolate *isolate, DirectHandle< Map > map)
void NotifyLeafMapLayoutChange(Isolate *isolate)
V8_INLINE DirectHandle< T > ToHandleChecked() const
V8_WARN_UNUSED_RESULT V8_INLINE bool ToHandle(DirectHandle< S > *out) const
V8_INLINE bool is_null() const
V8_WARN_UNUSED_RESULT V8_INLINE bool ToHandle(Handle< S > *out) const
static MaybeObjectDirectHandle Weak(Tagged< Object > object, Isolate *isolate)
static int GetIndex(Isolate *isolate, Tagged< Map > map, Tagged< HeapObject > prototype)
void Set(Isolate *isolate, DirectHandle< Map > fast_map, DirectHandle< Map > normalized_map)
static const int kEntries
V8_WARN_UNUSED_RESULT MaybeHandle< Map > Get(Isolate *isolate, DirectHandle< Map > fast_map, ElementsKind elements_kind, Tagged< HeapObject > prototype, PropertyNormalizationMode mode)
static NEVER_READ_ONLY_SPACE DirectHandle< NormalizedMapCache > New(Isolate *isolate)
static DirectHandle< FieldType > OptimalType(Tagged< Object > obj, Isolate *isolate, Representation representation)
static Representation OptimalRepresentation(Tagged< Object > obj, PtrComprCageBase cage_base)
static bool FilterKey(Tagged< Object > obj, PropertyFilter filter)
static bool FitsRepresentation(Tagged< Object > obj, Representation representation, bool allow_coercion=true)
PropertyAttributes attributes() const
PropertyLocation location() const
int field_width_in_words() const
Representation representation() const
PropertyKind kind() const
PropertyConstness constness() const
static void AddDerivedMap(DirectHandle< PrototypeInfo > info, DirectHandle< Map > to, Isolate *isolate)
static void SetObjectCreateMap(DirectHandle< PrototypeInfo > info, DirectHandle< Map > map, Isolate *isolate)
static bool IsPrototypeInfoFast(Tagged< Object > object)
bool fits_into(const Representation &other) const
static constexpr Representation Tagged()
static constexpr Tagged< Smi > zero()
void set(int index, Tagged< ElementT > value, WriteBarrierMode mode=kDefaultMode)
Tagged< ElementT > get(int index) const
constexpr bool IsCleared() const
bool GetHeapObjectIfWeak(Tagged< HeapObject > *result) const
V8_INLINE constexpr bool is_null() const
static bool CanHaveMoreTransitions(Isolate *isolate, DirectHandle< Map > map)
static std::optional< Tagged< Map > > GetPrototypeTransition(Isolate *isolate, Tagged< Map > map, Tagged< Object > prototype)
Tagged< Map > SearchTransition(Tagged< Name > name, PropertyKind kind, PropertyAttributes attributes)
static bool PutPrototypeTransition(Isolate *isolate, DirectHandle< Map >, DirectHandle< Object > prototype, DirectHandle< Map > target_map)
static void SetMigrationTarget(Isolate *isolate, DirectHandle< Map > map, Tagged< Map > migration_target)
std::function< void(Tagged< Map >)> TraverseCallback
static void Insert(Isolate *isolate, DirectHandle< Map > map, DirectHandle< Name > name, DirectHandle< Map > target, TransitionKindFlag flag)
Tagged< Map > GetMigrationTarget()
Tagged< Map > SearchSpecial(Tagged< Symbol > name)
static void ForDescriptorArray(Tagged< DescriptorArray >, int number_of_own_descriptors)
#define COMPRESS_POINTERS_BOOL
ZoneVector< OpIndex > candidates
ZoneVector< RpoNumber > & result
#define LOG(isolate, Call)
#define MAKE_TQ_CASE(TYPE, Name)
V8_INLINE const Operation & Get(const Graph &graph, OpIndex index)
V8_INLINE IndirectHandle< T > handle(Tagged< T > object, Isolate *isolate)
const uint32_t kStringEncodingMask
constexpr const char * ToString(DeoptimizeKind kind)
bool IsSlowArgumentsElementsKind(ElementsKind kind)
constexpr int kTaggedSize
bool IsPrimitiveMap(Tagged< Map > map)
bool is_sloppy(LanguageMode language_mode)
constexpr bool IsHoleyElementsKind(ElementsKind kind)
static bool ContainsMap(MapHandlesSpan maps, Tagged< Map > map)
static Handle< Map > AddMissingElementsTransitions(Isolate *isolate, Handle< Map > map, ElementsKind to_kind)
bool IsMoreGeneralElementsKindTransition(ElementsKind from_kind, ElementsKind to_kind)
bool IsTransitionElementsKind(ElementsKind kind)
Map::Bits1::HasPrototypeSlotBit Map::Bits1::HasNamedInterceptorBit Map::Bits1::IsUndetectableBit Map::Bits1::IsConstructorBit bit_field2
bool IsCustomElementsReceiverMap(Tagged< Map > map)
bool IsTypedArrayElementsKind(ElementsKind kind)
ElementsKind GetPackedElementsKind(ElementsKind holey_kind)
bool IsSpecialReceiverMap(Tagged< Map > map)
@ HOLEY_NONEXTENSIBLE_ELEMENTS
@ SLOW_STRING_WRAPPER_ELEMENTS
@ PACKED_NONEXTENSIBLE_ELEMENTS
@ TERMINAL_FAST_ELEMENTS_KIND
@ SLOW_SLOPPY_ARGUMENTS_ELEMENTS
@ FAST_SLOPPY_ARGUMENTS_ELEMENTS
V8_INLINE DirectHandle< T > direct_handle(Tagged< T > object, Isolate *isolate)
too high values may cause the compiler to set high thresholds for inlining to as much as possible avoid inlined allocation of objects that cannot escape trace load stores from virtual maglev objects use TurboFan fast string builder analyze liveness of environment slots and zap dead values trace TurboFan load elimination emit data about basic block usage in builtins to this enable builtin reordering when run mksnapshot flag for emit warnings when applying builtin profile data verify register allocation in TurboFan randomly schedule instructions to stress dependency tracking enable store store elimination in TurboFan rewrite far to near simulate GC compiler thread race related to allow float parameters to be passed in simulator mode JS Wasm Run additional turbo_optimize_inlined_js_wasm_wrappers enable experimental feedback collection in generic lowering enable Turboshaft s WasmLoadElimination enable Turboshaft s low level load elimination for JS enable Turboshaft s escape analysis for string concatenation use enable Turbolev features that we want to ship in the not too far future trace individual Turboshaft reduction steps trace intermediate Turboshaft reduction steps invocation count threshold for early optimization Enables optimizations which favor memory size over execution speed Enables sampling allocation profiler with X as a sample interval min size of a semi the new space consists of two semi spaces max size of the Collect garbage after Collect garbage after keeps maps alive for< n > old space garbage collections print one detailed trace line in name
@ SIMPLE_PROPERTY_TRANSITION
return Cast< NumberDictionary >(elements(cage_base))
const uint32_t kOneByteStringTag
bool IsFastPackedElementsKind(ElementsKind kind)
static bool IsShortcutCandidate(int type)
static const int kInvalidEnumCacheSentinel
bool IsClass(Tagged< FieldType > obj)
DONT_OVERRIDE DISABLE_ALLOCATION_SITES HOLEY_ELEMENTS
Map::Bits1::HasPrototypeSlotBit Map::Bits1::HasNamedInterceptorBit Map::Bits1::IsUndetectableBit Map::Bits1::IsConstructorBit Map::Bits2::IsImmutablePrototypeBit is_deprecated
bool IsFrozenElementsKind(ElementsKind kind)
ElementsKind GetNextTransitionElementsKind(ElementsKind kind)
const uint32_t kStringRepresentationMask
bool IsJSObjectThatCanBeTrackedAsPrototype(Tagged< Object > obj)
bool IsTerminalElementsKind(ElementsKind kind)
bool IsFastElementsKind(ElementsKind kind)
Tagged< MaybeWeak< T > > MakeWeak(Tagged< T > value)
static const int kMaxNumberOfDescriptors
bool IsDictionaryElementsKind(ElementsKind kind)
V8_EXPORT_PRIVATE FlagValues v8_flags
bool IsAny(Tagged< FieldType > obj)
bool IsUniqueName(Tagged< Name > obj)
V8_INLINE bool IsWasmObject(T obj, Isolate *=nullptr)
static bool HasElementsKind(MapHandlesSpan maps, ElementsKind elements_kind)
static Tagged< Map > FindClosestElementsTransition(Isolate *isolate, Tagged< Map > map, ElementsKind to_kind, ConcurrencyMode cmode)
bool IsGeneralizableTo(PropertyLocation a, PropertyLocation b)
bool IsTypedArrayOrRabGsabTypedArrayElementsKind(ElementsKind kind)
bool IsStringWrapperElementsKind(ElementsKind kind)
bool IsTransitionableFastElementsKind(ElementsKind from_kind)
constructor_or_back_pointer
kInstanceDescriptorsOffset kTransitionsOrPrototypeInfoOffset IsNull(value)||IsJSProxy(value)||IsWasmObject(value)||(IsJSObject(value) &&(HeapLayout
constexpr bool IsConcurrent(ConcurrencyMode mode)
kInstanceDescriptorsOffset kTransitionsOrPrototypeInfoOffset prototype
static const size_t LanguageModeSize
!IsContextMap !IsContextMap native_context
PropertyNormalizationMode
@ KEEP_INOBJECT_PROPERTIES
@ CLEAR_INOBJECT_PROPERTIES
Tagged< To > Cast(Tagged< From > value, const v8::SourceLocation &loc=INIT_SOURCE_LOCATION_IN_DEBUG)
static constexpr ReleaseStoreTag kReleaseStore
static constexpr RelaxedLoadTag kRelaxedLoad
static constexpr RelaxedStoreTag kRelaxedStore
static constexpr AcquireLoadTag kAcquireLoad
#define SIMPLE_HEAP_OBJECT_LIST2(V)
#define CONCRETE_TRUSTED_OBJECT_TYPE_LIST2(V)
#define DCHECK_LE(v1, v2)
#define CHECK_IMPLIES(lhs, rhs)
#define CHECK_LT(lhs, rhs)
#define DCHECK_IMPLIES(v1, v2)
#define DCHECK_NE(v1, v2)
#define CHECK_EQ(lhs, rhs)
#define DCHECK(condition)
#define DCHECK_EQ(v1, v2)
#define TYPED_ARRAY_CONSTRUCTORS_SWITCH(Type, type, TYPE, Ctype)