LCOV - code coverage report
Current view: top level - src/objects - instance-type.h (source / functions) Hit Total Coverage
Test: app.info Lines: 1 1 100.0 %
Date: 2019-02-19 Functions: 0 0 -

          Line data    Source code
       1             : // Copyright 2018 the V8 project authors. All rights reserved.
       2             : // Use of this source code is governed by a BSD-style license that can be
       3             : // found in the LICENSE file.
       4             : 
       5             : #ifndef V8_OBJECTS_INSTANCE_TYPE_H_
       6             : #define V8_OBJECTS_INSTANCE_TYPE_H_
       7             : 
       8             : #include "src/elements-kind.h"
       9             : #include "src/objects-definitions.h"
      10             : 
      11             : // Has to be the last include (doesn't have include guards):
      12             : #include "src/objects/object-macros.h"
      13             : 
      14             : namespace v8 {
      15             : namespace internal {
      16             : 
      17             : // We use the full 16 bits of the instance_type field to encode heap object
      18             : // instance types. All the high-order bits (bit 7-15) are cleared if the object
      19             : // is a string, and contain set bits if it is not a string.
      20             : const uint32_t kIsNotStringMask = 0xff80;
      21             : const uint32_t kStringTag = 0x0;
      22             : 
      23             : // Bit 6 indicates that the object is an internalized string (if set) or not.
      24             : // Bit 7 has to be clear as well.
      25             : const uint32_t kIsNotInternalizedMask = 0x40;
      26             : const uint32_t kNotInternalizedTag = 0x40;
      27             : const uint32_t kInternalizedTag = 0x0;
      28             : 
      29             : // If bit 7 is clear then bit 3 indicates whether the string consists of
      30             : // two-byte characters or one-byte characters.
      31             : const uint32_t kStringEncodingMask = 0x8;
      32             : const uint32_t kTwoByteStringTag = 0x0;
      33             : const uint32_t kOneByteStringTag = 0x8;
      34             : 
      35             : // If bit 7 is clear, the low-order 3 bits indicate the representation
      36             : // of the string.
      37             : const uint32_t kStringRepresentationMask = 0x07;
      38             : enum StringRepresentationTag {
      39             :   kSeqStringTag = 0x0,
      40             :   kConsStringTag = 0x1,
      41             :   kExternalStringTag = 0x2,
      42             :   kSlicedStringTag = 0x3,
      43             :   kThinStringTag = 0x5
      44             : };
      45             : const uint32_t kIsIndirectStringMask = 0x1;
      46             : const uint32_t kIsIndirectStringTag = 0x1;
      47             : STATIC_ASSERT((kSeqStringTag & kIsIndirectStringMask) == 0);       // NOLINT
      48             : STATIC_ASSERT((kExternalStringTag & kIsIndirectStringMask) == 0);  // NOLINT
      49             : STATIC_ASSERT((kConsStringTag & kIsIndirectStringMask) ==
      50             :               kIsIndirectStringTag);  // NOLINT
      51             : STATIC_ASSERT((kSlicedStringTag & kIsIndirectStringMask) ==
      52             :               kIsIndirectStringTag);  // NOLINT
      53             : STATIC_ASSERT((kThinStringTag & kIsIndirectStringMask) == kIsIndirectStringTag);
      54             : 
      55             : // If bit 7 is clear, then bit 4 indicates whether this two-byte
      56             : // string actually contains one byte data.
      57             : const uint32_t kOneByteDataHintMask = 0x10;
      58             : const uint32_t kOneByteDataHintTag = 0x10;
      59             : 
      60             : // If bit 7 is clear and string representation indicates an external string,
      61             : // then bit 5 indicates whether the data pointer is cached.
      62             : const uint32_t kUncachedExternalStringMask = 0x20;
      63             : const uint32_t kUncachedExternalStringTag = 0x20;
      64             : 
      65             : // A ConsString with an empty string as the right side is a candidate
      66             : // for being shortcut by the garbage collector. We don't allocate any
      67             : // non-flat internalized strings, so we do not shortcut them thereby
      68             : // avoiding turning internalized strings into strings. The bit-masks
      69             : // below contain the internalized bit as additional safety.
      70             : // See heap.cc, mark-compact.cc and objects-visiting.cc.
      71             : const uint32_t kShortcutTypeMask =
      72             :     kIsNotStringMask | kIsNotInternalizedMask | kStringRepresentationMask;
      73             : const uint32_t kShortcutTypeTag = kConsStringTag | kNotInternalizedTag;
      74             : 
      75             : static inline bool IsShortcutCandidate(int type) {
      76         112 :   return ((type & kShortcutTypeMask) == kShortcutTypeTag);
      77             : }
      78             : 
      79             : enum InstanceType : uint16_t {
      80             :   // String types.
      81             :   INTERNALIZED_STRING_TYPE = kTwoByteStringTag | kSeqStringTag |
      82             :                              kInternalizedTag,  // FIRST_PRIMITIVE_TYPE
      83             :   ONE_BYTE_INTERNALIZED_STRING_TYPE =
      84             :       kOneByteStringTag | kSeqStringTag | kInternalizedTag,
      85             :   EXTERNAL_INTERNALIZED_STRING_TYPE =
      86             :       kTwoByteStringTag | kExternalStringTag | kInternalizedTag,
      87             :   EXTERNAL_ONE_BYTE_INTERNALIZED_STRING_TYPE =
      88             :       kOneByteStringTag | kExternalStringTag | kInternalizedTag,
      89             :   EXTERNAL_INTERNALIZED_STRING_WITH_ONE_BYTE_DATA_TYPE =
      90             :       EXTERNAL_INTERNALIZED_STRING_TYPE | kOneByteDataHintTag |
      91             :       kInternalizedTag,
      92             :   UNCACHED_EXTERNAL_INTERNALIZED_STRING_TYPE =
      93             :       EXTERNAL_INTERNALIZED_STRING_TYPE | kUncachedExternalStringTag |
      94             :       kInternalizedTag,
      95             :   UNCACHED_EXTERNAL_ONE_BYTE_INTERNALIZED_STRING_TYPE =
      96             :       EXTERNAL_ONE_BYTE_INTERNALIZED_STRING_TYPE | kUncachedExternalStringTag |
      97             :       kInternalizedTag,
      98             :   UNCACHED_EXTERNAL_INTERNALIZED_STRING_WITH_ONE_BYTE_DATA_TYPE =
      99             :       EXTERNAL_INTERNALIZED_STRING_WITH_ONE_BYTE_DATA_TYPE |
     100             :       kUncachedExternalStringTag | kInternalizedTag,
     101             :   STRING_TYPE = INTERNALIZED_STRING_TYPE | kNotInternalizedTag,
     102             :   ONE_BYTE_STRING_TYPE =
     103             :       ONE_BYTE_INTERNALIZED_STRING_TYPE | kNotInternalizedTag,
     104             :   CONS_STRING_TYPE = kTwoByteStringTag | kConsStringTag | kNotInternalizedTag,
     105             :   CONS_ONE_BYTE_STRING_TYPE =
     106             :       kOneByteStringTag | kConsStringTag | kNotInternalizedTag,
     107             :   SLICED_STRING_TYPE =
     108             :       kTwoByteStringTag | kSlicedStringTag | kNotInternalizedTag,
     109             :   SLICED_ONE_BYTE_STRING_TYPE =
     110             :       kOneByteStringTag | kSlicedStringTag | kNotInternalizedTag,
     111             :   EXTERNAL_STRING_TYPE =
     112             :       EXTERNAL_INTERNALIZED_STRING_TYPE | kNotInternalizedTag,
     113             :   EXTERNAL_ONE_BYTE_STRING_TYPE =
     114             :       EXTERNAL_ONE_BYTE_INTERNALIZED_STRING_TYPE | kNotInternalizedTag,
     115             :   EXTERNAL_STRING_WITH_ONE_BYTE_DATA_TYPE =
     116             :       EXTERNAL_INTERNALIZED_STRING_WITH_ONE_BYTE_DATA_TYPE |
     117             :       kNotInternalizedTag,
     118             :   UNCACHED_EXTERNAL_STRING_TYPE =
     119             :       UNCACHED_EXTERNAL_INTERNALIZED_STRING_TYPE | kNotInternalizedTag,
     120             :   UNCACHED_EXTERNAL_ONE_BYTE_STRING_TYPE =
     121             :       UNCACHED_EXTERNAL_ONE_BYTE_INTERNALIZED_STRING_TYPE | kNotInternalizedTag,
     122             :   UNCACHED_EXTERNAL_STRING_WITH_ONE_BYTE_DATA_TYPE =
     123             :       UNCACHED_EXTERNAL_INTERNALIZED_STRING_WITH_ONE_BYTE_DATA_TYPE |
     124             :       kNotInternalizedTag,
     125             :   THIN_STRING_TYPE = kTwoByteStringTag | kThinStringTag | kNotInternalizedTag,
     126             :   THIN_ONE_BYTE_STRING_TYPE =
     127             :       kOneByteStringTag | kThinStringTag | kNotInternalizedTag,
     128             : 
     129             :   // Non-string names
     130             :   SYMBOL_TYPE =
     131             :       1 + (kIsNotInternalizedMask | kUncachedExternalStringMask |
     132             :            kOneByteDataHintMask | kStringEncodingMask |
     133             :            kStringRepresentationMask),  // FIRST_NONSTRING_TYPE, LAST_NAME_TYPE
     134             : 
     135             :   // Other primitives (cannot contain non-map-word pointers to heap objects).
     136             :   HEAP_NUMBER_TYPE,
     137             :   BIGINT_TYPE,
     138             :   ODDBALL_TYPE,  // LAST_PRIMITIVE_TYPE
     139             : 
     140             :   // Objects allocated in their own spaces (never in new space).
     141             :   MAP_TYPE,
     142             :   CODE_TYPE,
     143             : 
     144             :   // "Data", objects that cannot contain non-map-word pointers to heap
     145             :   // objects.
     146             :   MUTABLE_HEAP_NUMBER_TYPE,
     147             :   FOREIGN_TYPE,
     148             :   BYTE_ARRAY_TYPE,
     149             :   BYTECODE_ARRAY_TYPE,
     150             :   FREE_SPACE_TYPE,
     151             :   FIXED_INT8_ARRAY_TYPE,  // FIRST_FIXED_TYPED_ARRAY_TYPE
     152             :   FIXED_UINT8_ARRAY_TYPE,
     153             :   FIXED_INT16_ARRAY_TYPE,
     154             :   FIXED_UINT16_ARRAY_TYPE,
     155             :   FIXED_INT32_ARRAY_TYPE,
     156             :   FIXED_UINT32_ARRAY_TYPE,
     157             :   FIXED_FLOAT32_ARRAY_TYPE,
     158             :   FIXED_FLOAT64_ARRAY_TYPE,
     159             :   FIXED_UINT8_CLAMPED_ARRAY_TYPE,
     160             :   FIXED_BIGINT64_ARRAY_TYPE,
     161             :   FIXED_BIGUINT64_ARRAY_TYPE,  // LAST_FIXED_TYPED_ARRAY_TYPE
     162             :   FIXED_DOUBLE_ARRAY_TYPE,
     163             :   FEEDBACK_METADATA_TYPE,
     164             :   FILLER_TYPE,  // LAST_DATA_TYPE
     165             : 
     166             :   // Structs.
     167             :   ACCESS_CHECK_INFO_TYPE,
     168             :   ACCESSOR_INFO_TYPE,
     169             :   ACCESSOR_PAIR_TYPE,
     170             :   ALIASED_ARGUMENTS_ENTRY_TYPE,
     171             :   ALLOCATION_MEMENTO_TYPE,
     172             :   ASM_WASM_DATA_TYPE,
     173             :   ASYNC_GENERATOR_REQUEST_TYPE,
     174             :   CLASS_POSITIONS_TYPE,
     175             :   DEBUG_INFO_TYPE,
     176             :   FUNCTION_TEMPLATE_INFO_TYPE,
     177             :   FUNCTION_TEMPLATE_RARE_DATA_TYPE,
     178             :   INTERCEPTOR_INFO_TYPE,
     179             :   INTERPRETER_DATA_TYPE,
     180             :   MODULE_INFO_ENTRY_TYPE,
     181             :   MODULE_TYPE,
     182             :   OBJECT_TEMPLATE_INFO_TYPE,
     183             :   PROMISE_CAPABILITY_TYPE,
     184             :   PROMISE_REACTION_TYPE,
     185             :   PROTOTYPE_INFO_TYPE,
     186             :   SCRIPT_TYPE,
     187             :   STACK_FRAME_INFO_TYPE,
     188             :   STACK_TRACE_FRAME_TYPE,
     189             :   TUPLE2_TYPE,
     190             :   TUPLE3_TYPE,
     191             :   ARRAY_BOILERPLATE_DESCRIPTION_TYPE,
     192             :   WASM_DEBUG_INFO_TYPE,
     193             :   WASM_EXCEPTION_TAG_TYPE,
     194             :   WASM_EXPORTED_FUNCTION_DATA_TYPE,
     195             : 
     196             :   CALLABLE_TASK_TYPE,  // FIRST_MICROTASK_TYPE
     197             :   CALLBACK_TASK_TYPE,
     198             :   PROMISE_FULFILL_REACTION_JOB_TASK_TYPE,
     199             :   PROMISE_REJECT_REACTION_JOB_TASK_TYPE,
     200             :   PROMISE_RESOLVE_THENABLE_JOB_TASK_TYPE,
     201             :   FINALIZATION_GROUP_CLEANUP_JOB_TASK_TYPE,  // LAST_MICROTASK_TYPE
     202             : 
     203             :   ALLOCATION_SITE_TYPE,
     204             :   EMBEDDER_DATA_ARRAY_TYPE,
     205             :   // FixedArrays.
     206             :   FIXED_ARRAY_TYPE,  // FIRST_FIXED_ARRAY_TYPE
     207             :   OBJECT_BOILERPLATE_DESCRIPTION_TYPE,
     208             :   HASH_TABLE_TYPE,        // FIRST_HASH_TABLE_TYPE
     209             :   ORDERED_HASH_MAP_TYPE,  // FIRST_DICTIONARY_TYPE
     210             :   ORDERED_HASH_SET_TYPE,
     211             :   ORDERED_NAME_DICTIONARY_TYPE,
     212             :   NAME_DICTIONARY_TYPE,
     213             :   GLOBAL_DICTIONARY_TYPE,
     214             :   NUMBER_DICTIONARY_TYPE,
     215             :   SIMPLE_NUMBER_DICTIONARY_TYPE,  // LAST_DICTIONARY_TYPE
     216             :   STRING_TABLE_TYPE,
     217             :   EPHEMERON_HASH_TABLE_TYPE,  // LAST_HASH_TABLE_TYPE
     218             :   SCOPE_INFO_TYPE,
     219             :   SCRIPT_CONTEXT_TABLE_TYPE,  // LAST_FIXED_ARRAY_TYPE,
     220             : 
     221             :   // Contexts.
     222             :   AWAIT_CONTEXT_TYPE,  // FIRST_CONTEXT_TYPE
     223             :   BLOCK_CONTEXT_TYPE,
     224             :   CATCH_CONTEXT_TYPE,
     225             :   DEBUG_EVALUATE_CONTEXT_TYPE,
     226             :   EVAL_CONTEXT_TYPE,
     227             :   FUNCTION_CONTEXT_TYPE,
     228             :   MODULE_CONTEXT_TYPE,
     229             :   NATIVE_CONTEXT_TYPE,
     230             :   SCRIPT_CONTEXT_TYPE,
     231             :   WITH_CONTEXT_TYPE,  // LAST_CONTEXT_TYPE
     232             : 
     233             :   WEAK_FIXED_ARRAY_TYPE,  // FIRST_WEAK_FIXED_ARRAY_TYPE
     234             :   TRANSITION_ARRAY_TYPE,  // LAST_WEAK_FIXED_ARRAY_TYPE
     235             : 
     236             :   // Misc.
     237             :   CALL_HANDLER_INFO_TYPE,
     238             :   CELL_TYPE,
     239             :   CODE_DATA_CONTAINER_TYPE,
     240             :   DESCRIPTOR_ARRAY_TYPE,
     241             :   FEEDBACK_CELL_TYPE,
     242             :   FEEDBACK_VECTOR_TYPE,
     243             :   LOAD_HANDLER_TYPE,
     244             :   PREPARSE_DATA_TYPE,
     245             :   PROPERTY_ARRAY_TYPE,
     246             :   PROPERTY_CELL_TYPE,
     247             :   SHARED_FUNCTION_INFO_TYPE,
     248             :   SMALL_ORDERED_HASH_MAP_TYPE,
     249             :   SMALL_ORDERED_HASH_SET_TYPE,
     250             :   SMALL_ORDERED_NAME_DICTIONARY_TYPE,
     251             :   STORE_HANDLER_TYPE,
     252             :   UNCOMPILED_DATA_WITHOUT_PREPARSE_DATA_TYPE,
     253             :   UNCOMPILED_DATA_WITH_PREPARSE_DATA_TYPE,
     254             :   WEAK_ARRAY_LIST_TYPE,
     255             :   WEAK_CELL_TYPE,
     256             : 
     257             :   // All the following types are subtypes of JSReceiver, which corresponds to
     258             :   // objects in the JS sense. The first and the last type in this range are
     259             :   // the two forms of function. This organization enables using the same
     260             :   // compares for checking the JS_RECEIVER and the NONCALLABLE_JS_OBJECT range.
     261             :   // Some of the following instance types are exposed in v8.h, so to not
     262             :   // unnecessarily change the ABI when we introduce new instance types in the
     263             :   // future, we leave some space between instance types.
     264             :   JS_PROXY_TYPE = 0x0400,  // FIRST_JS_RECEIVER_TYPE
     265             :   JS_GLOBAL_OBJECT_TYPE,   // FIRST_JS_OBJECT_TYPE
     266             :   JS_GLOBAL_PROXY_TYPE,
     267             :   JS_MODULE_NAMESPACE_TYPE,
     268             :   // Like JS_API_OBJECT_TYPE, but requires access checks and/or has
     269             :   // interceptors.
     270             :   JS_SPECIAL_API_OBJECT_TYPE = 0x0410,  // LAST_SPECIAL_RECEIVER_TYPE
     271             :   JS_VALUE_TYPE,                        // LAST_CUSTOM_ELEMENTS_RECEIVER
     272             :   // Like JS_OBJECT_TYPE, but created from API function.
     273             :   JS_API_OBJECT_TYPE = 0x0420,
     274             :   JS_OBJECT_TYPE,
     275             :   JS_ARGUMENTS_TYPE,
     276             :   JS_ARRAY_BUFFER_TYPE,
     277             :   JS_ARRAY_ITERATOR_TYPE,
     278             :   JS_ARRAY_TYPE,
     279             :   JS_ASYNC_FROM_SYNC_ITERATOR_TYPE,
     280             :   JS_ASYNC_FUNCTION_OBJECT_TYPE,
     281             :   JS_ASYNC_GENERATOR_OBJECT_TYPE,
     282             :   JS_CONTEXT_EXTENSION_OBJECT_TYPE,
     283             :   JS_DATE_TYPE,
     284             :   JS_ERROR_TYPE,
     285             :   JS_GENERATOR_OBJECT_TYPE,
     286             :   JS_MAP_TYPE,
     287             :   JS_MAP_KEY_ITERATOR_TYPE,
     288             :   JS_MAP_KEY_VALUE_ITERATOR_TYPE,
     289             :   JS_MAP_VALUE_ITERATOR_TYPE,
     290             :   JS_MESSAGE_OBJECT_TYPE,
     291             :   JS_PROMISE_TYPE,
     292             :   JS_REGEXP_TYPE,
     293             :   JS_REGEXP_STRING_ITERATOR_TYPE,
     294             :   JS_SET_TYPE,
     295             :   JS_SET_KEY_VALUE_ITERATOR_TYPE,
     296             :   JS_SET_VALUE_ITERATOR_TYPE,
     297             :   JS_STRING_ITERATOR_TYPE,
     298             :   JS_WEAK_REF_TYPE,
     299             :   JS_FINALIZATION_GROUP_CLEANUP_ITERATOR_TYPE,
     300             :   JS_FINALIZATION_GROUP_TYPE,
     301             :   JS_WEAK_MAP_TYPE,
     302             :   JS_WEAK_SET_TYPE,
     303             : 
     304             :   JS_TYPED_ARRAY_TYPE,
     305             :   JS_DATA_VIEW_TYPE,
     306             : 
     307             : #ifdef V8_INTL_SUPPORT
     308             :   JS_INTL_V8_BREAK_ITERATOR_TYPE,
     309             :   JS_INTL_COLLATOR_TYPE,
     310             :   JS_INTL_DATE_TIME_FORMAT_TYPE,
     311             :   JS_INTL_LIST_FORMAT_TYPE,
     312             :   JS_INTL_LOCALE_TYPE,
     313             :   JS_INTL_NUMBER_FORMAT_TYPE,
     314             :   JS_INTL_PLURAL_RULES_TYPE,
     315             :   JS_INTL_RELATIVE_TIME_FORMAT_TYPE,
     316             :   JS_INTL_SEGMENT_ITERATOR_TYPE,
     317             :   JS_INTL_SEGMENTER_TYPE,
     318             : #endif  // V8_INTL_SUPPORT
     319             : 
     320             :   WASM_EXCEPTION_TYPE,
     321             :   WASM_GLOBAL_TYPE,
     322             :   WASM_INSTANCE_TYPE,
     323             :   WASM_MEMORY_TYPE,
     324             :   WASM_MODULE_TYPE,
     325             :   WASM_TABLE_TYPE,
     326             :   JS_BOUND_FUNCTION_TYPE,
     327             :   JS_FUNCTION_TYPE,  // LAST_JS_OBJECT_TYPE, LAST_JS_RECEIVER_TYPE
     328             : 
     329             :   // Pseudo-types
     330             :   FIRST_TYPE = 0x0,
     331             :   LAST_TYPE = JS_FUNCTION_TYPE,
     332             :   FIRST_STRING_TYPE = FIRST_TYPE,
     333             :   FIRST_NAME_TYPE = FIRST_STRING_TYPE,
     334             :   LAST_NAME_TYPE = SYMBOL_TYPE,
     335             :   FIRST_UNIQUE_NAME_TYPE = INTERNALIZED_STRING_TYPE,
     336             :   LAST_UNIQUE_NAME_TYPE = SYMBOL_TYPE,
     337             :   FIRST_NONSTRING_TYPE = SYMBOL_TYPE,
     338             :   FIRST_PRIMITIVE_TYPE = FIRST_NAME_TYPE,
     339             :   LAST_PRIMITIVE_TYPE = ODDBALL_TYPE,
     340             :   FIRST_FUNCTION_TYPE = JS_BOUND_FUNCTION_TYPE,
     341             :   LAST_FUNCTION_TYPE = JS_FUNCTION_TYPE,
     342             :   // Boundaries for testing if given HeapObject is a subclass of FixedArray.
     343             :   FIRST_FIXED_ARRAY_TYPE = FIXED_ARRAY_TYPE,
     344             :   LAST_FIXED_ARRAY_TYPE = SCRIPT_CONTEXT_TABLE_TYPE,
     345             :   // Boundaries for testing if given HeapObject is a subclass of HashTable
     346             :   FIRST_HASH_TABLE_TYPE = HASH_TABLE_TYPE,
     347             :   LAST_HASH_TABLE_TYPE = EPHEMERON_HASH_TABLE_TYPE,
     348             :   // Boundaries for testing if given HeapObject is a subclass of Dictionary
     349             :   FIRST_DICTIONARY_TYPE = ORDERED_HASH_MAP_TYPE,
     350             :   LAST_DICTIONARY_TYPE = SIMPLE_NUMBER_DICTIONARY_TYPE,
     351             :   // Boundaries for testing if given HeapObject is a subclass of WeakFixedArray.
     352             :   FIRST_WEAK_FIXED_ARRAY_TYPE = WEAK_FIXED_ARRAY_TYPE,
     353             :   LAST_WEAK_FIXED_ARRAY_TYPE = TRANSITION_ARRAY_TYPE,
     354             :   // Boundaries for testing if given HeapObject is a Context
     355             :   FIRST_CONTEXT_TYPE = AWAIT_CONTEXT_TYPE,
     356             :   LAST_CONTEXT_TYPE = WITH_CONTEXT_TYPE,
     357             :   // Boundaries for testing if given HeapObject is a subclass of Microtask.
     358             :   FIRST_MICROTASK_TYPE = CALLABLE_TASK_TYPE,
     359             :   LAST_MICROTASK_TYPE = FINALIZATION_GROUP_CLEANUP_JOB_TASK_TYPE,
     360             :   // Boundaries for testing for a fixed typed array.
     361             :   FIRST_FIXED_TYPED_ARRAY_TYPE = FIXED_INT8_ARRAY_TYPE,
     362             :   LAST_FIXED_TYPED_ARRAY_TYPE = FIXED_BIGUINT64_ARRAY_TYPE,
     363             :   // Boundary for promotion to old space.
     364             :   LAST_DATA_TYPE = FILLER_TYPE,
     365             :   // Boundary for objects represented as JSReceiver (i.e. JSObject or JSProxy).
     366             :   // Note that there is no range for JSObject or JSProxy, since their subtypes
     367             :   // are not continuous in this enum! The enum ranges instead reflect the
     368             :   // external class names, where proxies are treated as either ordinary objects,
     369             :   // or functions.
     370             :   FIRST_JS_RECEIVER_TYPE = JS_PROXY_TYPE,
     371             :   LAST_JS_RECEIVER_TYPE = LAST_TYPE,
     372             :   // Boundaries for testing the types represented as JSObject
     373             :   FIRST_JS_OBJECT_TYPE = JS_GLOBAL_OBJECT_TYPE,
     374             :   LAST_JS_OBJECT_TYPE = LAST_TYPE,
     375             :   // Boundary for testing JSReceivers that need special property lookup handling
     376             :   LAST_SPECIAL_RECEIVER_TYPE = JS_SPECIAL_API_OBJECT_TYPE,
     377             :   // Boundary case for testing JSReceivers that may have elements while having
     378             :   // an empty fixed array as elements backing store. This is true for string
     379             :   // wrappers.
     380             :   LAST_CUSTOM_ELEMENTS_RECEIVER = JS_VALUE_TYPE,
     381             : 
     382             :   FIRST_SET_ITERATOR_TYPE = JS_SET_KEY_VALUE_ITERATOR_TYPE,
     383             :   LAST_SET_ITERATOR_TYPE = JS_SET_VALUE_ITERATOR_TYPE,
     384             : 
     385             :   FIRST_MAP_ITERATOR_TYPE = JS_MAP_KEY_ITERATOR_TYPE,
     386             :   LAST_MAP_ITERATOR_TYPE = JS_MAP_VALUE_ITERATOR_TYPE,
     387             : };
     388             : 
     389             : // This constant is defined outside of the InstanceType enum because the
     390             : // string instance types are sparce and there's no such a string instance type.
     391             : // But it's still useful for range checks to have such a value.
     392             : constexpr InstanceType LAST_STRING_TYPE =
     393             :     static_cast<InstanceType>(FIRST_NONSTRING_TYPE - 1);
     394             : 
     395             : STATIC_ASSERT((FIRST_NONSTRING_TYPE & kIsNotStringMask) != kStringTag);
     396             : STATIC_ASSERT(JS_OBJECT_TYPE == Internals::kJSObjectType);
     397             : STATIC_ASSERT(JS_API_OBJECT_TYPE == Internals::kJSApiObjectType);
     398             : STATIC_ASSERT(JS_SPECIAL_API_OBJECT_TYPE == Internals::kJSSpecialApiObjectType);
     399             : STATIC_ASSERT(FIRST_NONSTRING_TYPE == Internals::kFirstNonstringType);
     400             : STATIC_ASSERT(ODDBALL_TYPE == Internals::kOddballType);
     401             : STATIC_ASSERT(FOREIGN_TYPE == Internals::kForeignType);
     402             : 
     403             : V8_EXPORT_PRIVATE std::ostream& operator<<(std::ostream& os,
     404             :                                            InstanceType instance_type);
     405             : 
     406             : // List of object types that have a single unique instance type.
     407             : #define INSTANCE_TYPE_CHECKERS_SINGLE_BASE(V)                                \
     408             :   V(AllocationSite, ALLOCATION_SITE_TYPE)                                    \
     409             :   V(BigInt, BIGINT_TYPE)                                                     \
     410             :   V(ObjectBoilerplateDescription, OBJECT_BOILERPLATE_DESCRIPTION_TYPE)       \
     411             :   V(BreakPoint, TUPLE2_TYPE)                                                 \
     412             :   V(BreakPointInfo, TUPLE2_TYPE)                                             \
     413             :   V(ByteArray, BYTE_ARRAY_TYPE)                                              \
     414             :   V(BytecodeArray, BYTECODE_ARRAY_TYPE)                                      \
     415             :   V(CallHandlerInfo, CALL_HANDLER_INFO_TYPE)                                 \
     416             :   V(Cell, CELL_TYPE)                                                         \
     417             :   V(Code, CODE_TYPE)                                                         \
     418             :   V(CodeDataContainer, CODE_DATA_CONTAINER_TYPE)                             \
     419             :   V(CoverageInfo, FIXED_ARRAY_TYPE)                                          \
     420             :   V(DescriptorArray, DESCRIPTOR_ARRAY_TYPE)                                  \
     421             :   V(EmbedderDataArray, EMBEDDER_DATA_ARRAY_TYPE)                             \
     422             :   V(EphemeronHashTable, EPHEMERON_HASH_TABLE_TYPE)                           \
     423             :   V(FeedbackCell, FEEDBACK_CELL_TYPE)                                        \
     424             :   V(FeedbackMetadata, FEEDBACK_METADATA_TYPE)                                \
     425             :   V(FeedbackVector, FEEDBACK_VECTOR_TYPE)                                    \
     426             :   V(FixedArrayExact, FIXED_ARRAY_TYPE)                                       \
     427             :   V(FixedDoubleArray, FIXED_DOUBLE_ARRAY_TYPE)                               \
     428             :   V(Foreign, FOREIGN_TYPE)                                                   \
     429             :   V(FreeSpace, FREE_SPACE_TYPE)                                              \
     430             :   V(GlobalDictionary, GLOBAL_DICTIONARY_TYPE)                                \
     431             :   V(HeapNumber, HEAP_NUMBER_TYPE)                                            \
     432             :   V(JSArgumentsObject, JS_ARGUMENTS_TYPE)                                    \
     433             :   V(JSArgumentsObjectWithLength, JS_ARGUMENTS_TYPE)                          \
     434             :   V(JSArray, JS_ARRAY_TYPE)                                                  \
     435             :   V(JSArrayBuffer, JS_ARRAY_BUFFER_TYPE)                                     \
     436             :   V(JSArrayIterator, JS_ARRAY_ITERATOR_TYPE)                                 \
     437             :   V(JSAsyncFromSyncIterator, JS_ASYNC_FROM_SYNC_ITERATOR_TYPE)               \
     438             :   V(JSAsyncFunctionObject, JS_ASYNC_FUNCTION_OBJECT_TYPE)                    \
     439             :   V(JSAsyncGeneratorObject, JS_ASYNC_GENERATOR_OBJECT_TYPE)                  \
     440             :   V(JSBoundFunction, JS_BOUND_FUNCTION_TYPE)                                 \
     441             :   V(JSContextExtensionObject, JS_CONTEXT_EXTENSION_OBJECT_TYPE)              \
     442             :   V(JSDataView, JS_DATA_VIEW_TYPE)                                           \
     443             :   V(JSDate, JS_DATE_TYPE)                                                    \
     444             :   V(JSError, JS_ERROR_TYPE)                                                  \
     445             :   V(JSFunction, JS_FUNCTION_TYPE)                                            \
     446             :   V(JSGlobalObject, JS_GLOBAL_OBJECT_TYPE)                                   \
     447             :   V(JSGlobalProxy, JS_GLOBAL_PROXY_TYPE)                                     \
     448             :   V(JSMap, JS_MAP_TYPE)                                                      \
     449             :   V(JSMessageObject, JS_MESSAGE_OBJECT_TYPE)                                 \
     450             :   V(JSModuleNamespace, JS_MODULE_NAMESPACE_TYPE)                             \
     451             :   V(JSPromise, JS_PROMISE_TYPE)                                              \
     452             :   V(JSProxy, JS_PROXY_TYPE)                                                  \
     453             :   V(JSRegExp, JS_REGEXP_TYPE)                                                \
     454             :   V(JSRegExpResult, JS_ARRAY_TYPE)                                           \
     455             :   V(JSRegExpStringIterator, JS_REGEXP_STRING_ITERATOR_TYPE)                  \
     456             :   V(JSSet, JS_SET_TYPE)                                                      \
     457             :   V(JSStringIterator, JS_STRING_ITERATOR_TYPE)                               \
     458             :   V(JSTypedArray, JS_TYPED_ARRAY_TYPE)                                       \
     459             :   V(JSValue, JS_VALUE_TYPE)                                                  \
     460             :   V(JSFinalizationGroup, JS_FINALIZATION_GROUP_TYPE)                         \
     461             :   V(JSFinalizationGroupCleanupIterator,                                      \
     462             :     JS_FINALIZATION_GROUP_CLEANUP_ITERATOR_TYPE)                             \
     463             :   V(JSWeakMap, JS_WEAK_MAP_TYPE)                                             \
     464             :   V(JSWeakRef, JS_WEAK_REF_TYPE)                                             \
     465             :   V(JSWeakSet, JS_WEAK_SET_TYPE)                                             \
     466             :   V(LoadHandler, LOAD_HANDLER_TYPE)                                          \
     467             :   V(Map, MAP_TYPE)                                                           \
     468             :   V(MutableHeapNumber, MUTABLE_HEAP_NUMBER_TYPE)                             \
     469             :   V(NameDictionary, NAME_DICTIONARY_TYPE)                                    \
     470             :   V(NativeContext, NATIVE_CONTEXT_TYPE)                                      \
     471             :   V(NumberDictionary, NUMBER_DICTIONARY_TYPE)                                \
     472             :   V(Oddball, ODDBALL_TYPE)                                                   \
     473             :   V(OrderedHashMap, ORDERED_HASH_MAP_TYPE)                                   \
     474             :   V(OrderedHashSet, ORDERED_HASH_SET_TYPE)                                   \
     475             :   V(OrderedNameDictionary, ORDERED_NAME_DICTIONARY_TYPE)                     \
     476             :   V(PreparseData, PREPARSE_DATA_TYPE)                                        \
     477             :   V(PropertyArray, PROPERTY_ARRAY_TYPE)                                      \
     478             :   V(PropertyCell, PROPERTY_CELL_TYPE)                                        \
     479             :   V(PropertyDescriptorObject, FIXED_ARRAY_TYPE)                              \
     480             :   V(ScopeInfo, SCOPE_INFO_TYPE)                                              \
     481             :   V(ScriptContextTable, SCRIPT_CONTEXT_TABLE_TYPE)                           \
     482             :   V(SharedFunctionInfo, SHARED_FUNCTION_INFO_TYPE)                           \
     483             :   V(SimpleNumberDictionary, SIMPLE_NUMBER_DICTIONARY_TYPE)                   \
     484             :   V(SmallOrderedHashMap, SMALL_ORDERED_HASH_MAP_TYPE)                        \
     485             :   V(SmallOrderedHashSet, SMALL_ORDERED_HASH_SET_TYPE)                        \
     486             :   V(SmallOrderedNameDictionary, SMALL_ORDERED_NAME_DICTIONARY_TYPE)          \
     487             :   V(SourcePositionTableWithFrameCache, TUPLE2_TYPE)                          \
     488             :   V(StoreHandler, STORE_HANDLER_TYPE)                                        \
     489             :   V(StringTable, STRING_TABLE_TYPE)                                          \
     490             :   V(Symbol, SYMBOL_TYPE)                                                     \
     491             :   V(TemplateObjectDescription, TUPLE2_TYPE)                                  \
     492             :   V(TransitionArray, TRANSITION_ARRAY_TYPE)                                  \
     493             :   V(UncompiledDataWithoutPreparseData,                                       \
     494             :     UNCOMPILED_DATA_WITHOUT_PREPARSE_DATA_TYPE)                              \
     495             :   V(UncompiledDataWithPreparseData, UNCOMPILED_DATA_WITH_PREPARSE_DATA_TYPE) \
     496             :   V(WasmExceptionObject, WASM_EXCEPTION_TYPE)                                \
     497             :   V(WasmGlobalObject, WASM_GLOBAL_TYPE)                                      \
     498             :   V(WasmInstanceObject, WASM_INSTANCE_TYPE)                                  \
     499             :   V(WasmMemoryObject, WASM_MEMORY_TYPE)                                      \
     500             :   V(WasmModuleObject, WASM_MODULE_TYPE)                                      \
     501             :   V(WasmTableObject, WASM_TABLE_TYPE)                                        \
     502             :   V(WeakArrayList, WEAK_ARRAY_LIST_TYPE)                                     \
     503             :   V(WeakCell, WEAK_CELL_TYPE)
     504             : #ifdef V8_INTL_SUPPORT
     505             : 
     506             : #define INSTANCE_TYPE_CHECKERS_SINGLE(V)                     \
     507             :   INSTANCE_TYPE_CHECKERS_SINGLE_BASE(V)                      \
     508             :   V(JSV8BreakIterator, JS_INTL_V8_BREAK_ITERATOR_TYPE)       \
     509             :   V(JSCollator, JS_INTL_COLLATOR_TYPE)                       \
     510             :   V(JSDateTimeFormat, JS_INTL_DATE_TIME_FORMAT_TYPE)         \
     511             :   V(JSListFormat, JS_INTL_LIST_FORMAT_TYPE)                  \
     512             :   V(JSLocale, JS_INTL_LOCALE_TYPE)                           \
     513             :   V(JSNumberFormat, JS_INTL_NUMBER_FORMAT_TYPE)              \
     514             :   V(JSPluralRules, JS_INTL_PLURAL_RULES_TYPE)                \
     515             :   V(JSRelativeTimeFormat, JS_INTL_RELATIVE_TIME_FORMAT_TYPE) \
     516             :   V(JSSegmentIterator, JS_INTL_SEGMENT_ITERATOR_TYPE)        \
     517             :   V(JSSegmenter, JS_INTL_SEGMENTER_TYPE)
     518             : 
     519             : #else
     520             : 
     521             : #define INSTANCE_TYPE_CHECKERS_SINGLE(V) INSTANCE_TYPE_CHECKERS_SINGLE_BASE(V)
     522             : 
     523             : #endif  // V8_INTL_SUPPORT
     524             : 
     525             : #define INSTANCE_TYPE_CHECKERS_RANGE(V)                             \
     526             :   V(Context, FIRST_CONTEXT_TYPE, LAST_CONTEXT_TYPE)                 \
     527             :   V(Dictionary, FIRST_DICTIONARY_TYPE, LAST_DICTIONARY_TYPE)        \
     528             :   V(FixedArray, FIRST_FIXED_ARRAY_TYPE, LAST_FIXED_ARRAY_TYPE)      \
     529             :   V(FixedTypedArrayBase, FIRST_FIXED_TYPED_ARRAY_TYPE,              \
     530             :     LAST_FIXED_TYPED_ARRAY_TYPE)                                    \
     531             :   V(HashTable, FIRST_HASH_TABLE_TYPE, LAST_HASH_TABLE_TYPE)         \
     532             :   V(JSMapIterator, FIRST_MAP_ITERATOR_TYPE, LAST_MAP_ITERATOR_TYPE) \
     533             :   V(JSSetIterator, FIRST_SET_ITERATOR_TYPE, LAST_SET_ITERATOR_TYPE) \
     534             :   V(Microtask, FIRST_MICROTASK_TYPE, LAST_MICROTASK_TYPE)           \
     535             :   V(Name, FIRST_NAME_TYPE, LAST_NAME_TYPE)                          \
     536             :   V(String, FIRST_STRING_TYPE, LAST_STRING_TYPE)                    \
     537             :   V(WeakFixedArray, FIRST_WEAK_FIXED_ARRAY_TYPE, LAST_WEAK_FIXED_ARRAY_TYPE)
     538             : 
     539             : #define INSTANCE_TYPE_CHECKERS_CUSTOM(V) \
     540             :   V(FixedArrayBase)                      \
     541             :   V(InternalizedString)                  \
     542             :   V(JSObject)                            \
     543             :   V(JSReceiver)
     544             : 
     545             : #define INSTANCE_TYPE_CHECKERS(V)  \
     546             :   INSTANCE_TYPE_CHECKERS_SINGLE(V) \
     547             :   INSTANCE_TYPE_CHECKERS_RANGE(V)  \
     548             :   INSTANCE_TYPE_CHECKERS_CUSTOM(V)
     549             : 
     550             : namespace InstanceTypeChecker {
     551             : #define IS_TYPE_FUNCTION_DECL(Type, ...) \
     552             :   V8_INLINE bool Is##Type(InstanceType instance_type);
     553             : 
     554             : INSTANCE_TYPE_CHECKERS(IS_TYPE_FUNCTION_DECL)
     555             : 
     556             : #define TYPED_ARRAY_IS_TYPE_FUNCTION_DECL(Type, ...) \
     557             :   IS_TYPE_FUNCTION_DECL(Fixed##Type##Array)
     558             : TYPED_ARRAYS(TYPED_ARRAY_IS_TYPE_FUNCTION_DECL)
     559             : #undef TYPED_ARRAY_IS_TYPE_FUNCTION_DECL
     560             : 
     561             : #define STRUCT_IS_TYPE_FUNCTION_DECL(NAME, Name, name) \
     562             :   IS_TYPE_FUNCTION_DECL(Name)
     563             : STRUCT_LIST(STRUCT_IS_TYPE_FUNCTION_DECL)
     564             : #undef STRUCT_IS_TYPE_FUNCTION_DECL
     565             : 
     566             : #undef IS_TYPE_FUNCTION_DECL
     567             : }  // namespace InstanceTypeChecker
     568             : 
     569             : }  // namespace internal
     570             : }  // namespace v8
     571             : 
     572             : #include "src/objects/object-macros-undef.h"
     573             : 
     574             : #endif  // V8_OBJECTS_INSTANCE_TYPE_H_

Generated by: LCOV version 1.10