Index: src/heap/objects-visiting.cc |
diff --git a/src/heap/objects-visiting.cc b/src/heap/objects-visiting.cc |
index 8bc3ff0d92e09d95765ecfdb614024d3059cb917..45a8edc4b8e83658fa3e2aa0951382204a35acf4 100644 |
--- a/src/heap/objects-visiting.cc |
+++ b/src/heap/objects-visiting.cc |
@@ -10,6 +10,205 @@ |
namespace v8 { |
namespace internal { |
+ |
+VisitorId StaticVisitorBase::GetVisitorId(Map* map) { |
+ return GetVisitorId(map->instance_type(), map->instance_size(), |
+ FLAG_unbox_double_fields && !map->HasFastPointerLayout()); |
+} |
+ |
+VisitorId StaticVisitorBase::GetVisitorId(int instance_type, int instance_size, |
+ bool has_unboxed_fields) { |
+ if (instance_type < FIRST_NONSTRING_TYPE) { |
+ switch (instance_type & kStringRepresentationMask) { |
+ case kSeqStringTag: |
+ if ((instance_type & kStringEncodingMask) == kOneByteStringTag) { |
+ return kVisitSeqOneByteString; |
+ } else { |
+ return kVisitSeqTwoByteString; |
+ } |
+ |
+ case kConsStringTag: |
+ if (IsShortcutCandidate(instance_type)) { |
+ return kVisitShortcutCandidate; |
+ } else { |
+ return kVisitConsString; |
+ } |
+ |
+ case kSlicedStringTag: |
+ return kVisitSlicedString; |
+ |
+ case kExternalStringTag: |
+ return kVisitDataObject; |
+ |
+ case kThinStringTag: |
+ return kVisitThinString; |
+ } |
+ UNREACHABLE(); |
+ } |
+ |
+ switch (instance_type) { |
+ case BYTE_ARRAY_TYPE: |
+ return kVisitByteArray; |
+ |
+ case BYTECODE_ARRAY_TYPE: |
+ return kVisitBytecodeArray; |
+ |
+ case FREE_SPACE_TYPE: |
+ return kVisitFreeSpace; |
+ |
+ case FIXED_ARRAY_TYPE: |
+ return kVisitFixedArray; |
+ |
+ case FIXED_DOUBLE_ARRAY_TYPE: |
+ return kVisitFixedDoubleArray; |
+ |
+ case ODDBALL_TYPE: |
+ return kVisitOddball; |
+ |
+ case MAP_TYPE: |
+ return kVisitMap; |
+ |
+ case CODE_TYPE: |
+ return kVisitCode; |
+ |
+ case CELL_TYPE: |
+ return kVisitCell; |
+ |
+ case PROPERTY_CELL_TYPE: |
+ return kVisitPropertyCell; |
+ |
+ case WEAK_CELL_TYPE: |
+ return kVisitWeakCell; |
+ |
+ case TRANSITION_ARRAY_TYPE: |
+ return kVisitTransitionArray; |
+ |
+ case JS_WEAK_MAP_TYPE: |
+ case JS_WEAK_SET_TYPE: |
+ return kVisitJSWeakCollection; |
+ |
+ case JS_REGEXP_TYPE: |
+ return kVisitJSRegExp; |
+ |
+ case SHARED_FUNCTION_INFO_TYPE: |
+ return kVisitSharedFunctionInfo; |
+ |
+ case JS_PROXY_TYPE: |
+ return kVisitStruct; |
+ |
+ case SYMBOL_TYPE: |
+ return kVisitSymbol; |
+ |
+ case JS_ARRAY_BUFFER_TYPE: |
+ return kVisitJSArrayBuffer; |
+ |
+ case SMALL_ORDERED_HASH_MAP_TYPE: |
+ return kVisitSmallOrderedHashMap; |
+ |
+ case SMALL_ORDERED_HASH_SET_TYPE: |
+ return kVisitSmallOrderedHashSet; |
+ |
+ case JS_OBJECT_TYPE: |
+ case JS_ERROR_TYPE: |
+ case JS_ARGUMENTS_TYPE: |
+ case JS_ASYNC_FROM_SYNC_ITERATOR_TYPE: |
+ case JS_CONTEXT_EXTENSION_OBJECT_TYPE: |
+ case JS_GENERATOR_OBJECT_TYPE: |
+ case JS_ASYNC_GENERATOR_OBJECT_TYPE: |
+ case JS_MODULE_NAMESPACE_TYPE: |
+ case JS_VALUE_TYPE: |
+ case JS_DATE_TYPE: |
+ case JS_ARRAY_TYPE: |
+ case JS_GLOBAL_PROXY_TYPE: |
+ case JS_GLOBAL_OBJECT_TYPE: |
+ case JS_MESSAGE_OBJECT_TYPE: |
+ case JS_TYPED_ARRAY_TYPE: |
+ case JS_DATA_VIEW_TYPE: |
+ case JS_SET_TYPE: |
+ case JS_MAP_TYPE: |
+ case JS_SET_ITERATOR_TYPE: |
+ case JS_MAP_ITERATOR_TYPE: |
+ case JS_STRING_ITERATOR_TYPE: |
+ |
+ case JS_TYPED_ARRAY_KEY_ITERATOR_TYPE: |
+ case JS_FAST_ARRAY_KEY_ITERATOR_TYPE: |
+ case JS_GENERIC_ARRAY_KEY_ITERATOR_TYPE: |
+ case JS_UINT8_ARRAY_KEY_VALUE_ITERATOR_TYPE: |
+ case JS_INT8_ARRAY_KEY_VALUE_ITERATOR_TYPE: |
+ case JS_UINT16_ARRAY_KEY_VALUE_ITERATOR_TYPE: |
+ case JS_INT16_ARRAY_KEY_VALUE_ITERATOR_TYPE: |
+ case JS_UINT32_ARRAY_KEY_VALUE_ITERATOR_TYPE: |
+ case JS_INT32_ARRAY_KEY_VALUE_ITERATOR_TYPE: |
+ case JS_FLOAT32_ARRAY_KEY_VALUE_ITERATOR_TYPE: |
+ case JS_FLOAT64_ARRAY_KEY_VALUE_ITERATOR_TYPE: |
+ case JS_UINT8_CLAMPED_ARRAY_KEY_VALUE_ITERATOR_TYPE: |
+ case JS_FAST_SMI_ARRAY_KEY_VALUE_ITERATOR_TYPE: |
+ case JS_FAST_HOLEY_SMI_ARRAY_KEY_VALUE_ITERATOR_TYPE: |
+ case JS_FAST_ARRAY_KEY_VALUE_ITERATOR_TYPE: |
+ case JS_FAST_HOLEY_ARRAY_KEY_VALUE_ITERATOR_TYPE: |
+ case JS_FAST_DOUBLE_ARRAY_KEY_VALUE_ITERATOR_TYPE: |
+ case JS_FAST_HOLEY_DOUBLE_ARRAY_KEY_VALUE_ITERATOR_TYPE: |
+ case JS_GENERIC_ARRAY_KEY_VALUE_ITERATOR_TYPE: |
+ case JS_UINT8_ARRAY_VALUE_ITERATOR_TYPE: |
+ case JS_INT8_ARRAY_VALUE_ITERATOR_TYPE: |
+ case JS_UINT16_ARRAY_VALUE_ITERATOR_TYPE: |
+ case JS_INT16_ARRAY_VALUE_ITERATOR_TYPE: |
+ case JS_UINT32_ARRAY_VALUE_ITERATOR_TYPE: |
+ case JS_INT32_ARRAY_VALUE_ITERATOR_TYPE: |
+ case JS_FLOAT32_ARRAY_VALUE_ITERATOR_TYPE: |
+ case JS_FLOAT64_ARRAY_VALUE_ITERATOR_TYPE: |
+ case JS_UINT8_CLAMPED_ARRAY_VALUE_ITERATOR_TYPE: |
+ case JS_FAST_SMI_ARRAY_VALUE_ITERATOR_TYPE: |
+ case JS_FAST_HOLEY_SMI_ARRAY_VALUE_ITERATOR_TYPE: |
+ case JS_FAST_ARRAY_VALUE_ITERATOR_TYPE: |
+ case JS_FAST_HOLEY_ARRAY_VALUE_ITERATOR_TYPE: |
+ case JS_FAST_DOUBLE_ARRAY_VALUE_ITERATOR_TYPE: |
+ case JS_FAST_HOLEY_DOUBLE_ARRAY_VALUE_ITERATOR_TYPE: |
+ case JS_GENERIC_ARRAY_VALUE_ITERATOR_TYPE: |
+ |
+ case JS_PROMISE_CAPABILITY_TYPE: |
+ case JS_PROMISE_TYPE: |
+ case JS_BOUND_FUNCTION_TYPE: |
+ return has_unboxed_fields ? kVisitJSObject : kVisitJSObjectFast; |
+ case JS_API_OBJECT_TYPE: |
+ case JS_SPECIAL_API_OBJECT_TYPE: |
+ return kVisitJSApiObject; |
+ |
+ case JS_FUNCTION_TYPE: |
+ return kVisitJSFunction; |
+ |
+ case FILLER_TYPE: |
+ case FOREIGN_TYPE: |
+ case HEAP_NUMBER_TYPE: |
+ case MUTABLE_HEAP_NUMBER_TYPE: |
+ return kVisitDataObject; |
+ |
+ case FIXED_UINT8_ARRAY_TYPE: |
+ case FIXED_INT8_ARRAY_TYPE: |
+ case FIXED_UINT16_ARRAY_TYPE: |
+ case FIXED_INT16_ARRAY_TYPE: |
+ case FIXED_UINT32_ARRAY_TYPE: |
+ case FIXED_INT32_ARRAY_TYPE: |
+ case FIXED_FLOAT32_ARRAY_TYPE: |
+ case FIXED_UINT8_CLAMPED_ARRAY_TYPE: |
+ return kVisitFixedTypedArrayBase; |
+ |
+ case FIXED_FLOAT64_ARRAY_TYPE: |
+ return kVisitFixedFloat64Array; |
+ |
+#define MAKE_STRUCT_CASE(NAME, Name, name) case NAME##_TYPE: |
+ STRUCT_LIST(MAKE_STRUCT_CASE) |
+#undef MAKE_STRUCT_CASE |
+ if (instance_type == ALLOCATION_SITE_TYPE) { |
+ return kVisitAllocationSite; |
+ } |
+ |
+ return kVisitStruct; |
+ |
+ default: |
+ UNREACHABLE(); |
+ } |
+} |
// We don't record weak slots during marking or scavenges. Instead we do it |