V8 API Reference, 7.2.502.16 (for Deno 0.2.4)
instance-type.h
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  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  DEBUG_INFO_TYPE,
175  FUNCTION_TEMPLATE_INFO_TYPE,
176  FUNCTION_TEMPLATE_RARE_DATA_TYPE,
177  INTERCEPTOR_INFO_TYPE,
178  INTERPRETER_DATA_TYPE,
179  MODULE_INFO_ENTRY_TYPE,
180  MODULE_TYPE,
181  OBJECT_TEMPLATE_INFO_TYPE,
182  PROMISE_CAPABILITY_TYPE,
183  PROMISE_REACTION_TYPE,
184  PROTOTYPE_INFO_TYPE,
185  SCRIPT_TYPE,
186  STACK_FRAME_INFO_TYPE,
187  TUPLE2_TYPE,
188  TUPLE3_TYPE,
189  ARRAY_BOILERPLATE_DESCRIPTION_TYPE,
190  WASM_DEBUG_INFO_TYPE,
191  WASM_EXPORTED_FUNCTION_DATA_TYPE,
192 
193  CALLABLE_TASK_TYPE, // FIRST_MICROTASK_TYPE
194  CALLBACK_TASK_TYPE,
195  PROMISE_FULFILL_REACTION_JOB_TASK_TYPE,
196  PROMISE_REJECT_REACTION_JOB_TASK_TYPE,
197  PROMISE_RESOLVE_THENABLE_JOB_TASK_TYPE,
198  WEAK_FACTORY_CLEANUP_JOB_TASK_TYPE, // LAST_MICROTASK_TYPE
199 
200  ALLOCATION_SITE_TYPE,
201  EMBEDDER_DATA_ARRAY_TYPE,
202  // FixedArrays.
203  FIXED_ARRAY_TYPE, // FIRST_FIXED_ARRAY_TYPE
204  OBJECT_BOILERPLATE_DESCRIPTION_TYPE,
205  HASH_TABLE_TYPE, // FIRST_HASH_TABLE_TYPE
206  ORDERED_HASH_MAP_TYPE, // FIRST_DICTIONARY_TYPE
207  ORDERED_HASH_SET_TYPE,
208  ORDERED_NAME_DICTIONARY_TYPE,
209  NAME_DICTIONARY_TYPE,
210  GLOBAL_DICTIONARY_TYPE,
211  NUMBER_DICTIONARY_TYPE,
212  SIMPLE_NUMBER_DICTIONARY_TYPE, // LAST_DICTIONARY_TYPE
213  STRING_TABLE_TYPE,
214  EPHEMERON_HASH_TABLE_TYPE, // LAST_HASH_TABLE_TYPE
215  SCOPE_INFO_TYPE,
216  SCRIPT_CONTEXT_TABLE_TYPE, // LAST_FIXED_ARRAY_TYPE,
217 
218  // Contexts.
219  AWAIT_CONTEXT_TYPE, // FIRST_CONTEXT_TYPE
220  BLOCK_CONTEXT_TYPE,
221  CATCH_CONTEXT_TYPE,
222  DEBUG_EVALUATE_CONTEXT_TYPE,
223  EVAL_CONTEXT_TYPE,
224  FUNCTION_CONTEXT_TYPE,
225  MODULE_CONTEXT_TYPE,
226  NATIVE_CONTEXT_TYPE,
227  SCRIPT_CONTEXT_TYPE,
228  WITH_CONTEXT_TYPE, // LAST_CONTEXT_TYPE
229 
230  WEAK_FIXED_ARRAY_TYPE, // FIRST_WEAK_FIXED_ARRAY_TYPE
231  TRANSITION_ARRAY_TYPE, // LAST_WEAK_FIXED_ARRAY_TYPE
232 
233  // Misc.
234  CALL_HANDLER_INFO_TYPE,
235  CELL_TYPE,
236  CODE_DATA_CONTAINER_TYPE,
237  DESCRIPTOR_ARRAY_TYPE,
238  FEEDBACK_CELL_TYPE,
239  FEEDBACK_VECTOR_TYPE,
240  LOAD_HANDLER_TYPE,
241  PRE_PARSED_SCOPE_DATA_TYPE,
242  PROPERTY_ARRAY_TYPE,
243  PROPERTY_CELL_TYPE,
244  SHARED_FUNCTION_INFO_TYPE,
245  SMALL_ORDERED_HASH_MAP_TYPE,
246  SMALL_ORDERED_HASH_SET_TYPE,
247  SMALL_ORDERED_NAME_DICTIONARY_TYPE,
248  STORE_HANDLER_TYPE,
249  UNCOMPILED_DATA_WITHOUT_PRE_PARSED_SCOPE_TYPE,
250  UNCOMPILED_DATA_WITH_PRE_PARSED_SCOPE_TYPE,
251  WEAK_ARRAY_LIST_TYPE,
252 
253  // All the following types are subtypes of JSReceiver, which corresponds to
254  // objects in the JS sense. The first and the last type in this range are
255  // the two forms of function. This organization enables using the same
256  // compares for checking the JS_RECEIVER and the NONCALLABLE_JS_OBJECT range.
257  // Some of the following instance types are exposed in v8.h, so to not
258  // unnecessarily change the ABI when we introduce new instance types in the
259  // future, we leave some space between instance types.
260  JS_PROXY_TYPE = 0x0400, // FIRST_JS_RECEIVER_TYPE
261  JS_GLOBAL_OBJECT_TYPE, // FIRST_JS_OBJECT_TYPE
262  JS_GLOBAL_PROXY_TYPE,
263  JS_MODULE_NAMESPACE_TYPE,
264  // Like JS_API_OBJECT_TYPE, but requires access checks and/or has
265  // interceptors.
266  JS_SPECIAL_API_OBJECT_TYPE = 0x0410, // LAST_SPECIAL_RECEIVER_TYPE
267  JS_VALUE_TYPE, // LAST_CUSTOM_ELEMENTS_RECEIVER
268  // Like JS_OBJECT_TYPE, but created from API function.
269  JS_API_OBJECT_TYPE = 0x0420,
270  JS_OBJECT_TYPE,
271  JS_ARGUMENTS_TYPE,
272  JS_ARRAY_BUFFER_TYPE,
273  JS_ARRAY_ITERATOR_TYPE,
274  JS_ARRAY_TYPE,
275  JS_ASYNC_FROM_SYNC_ITERATOR_TYPE,
276  JS_ASYNC_FUNCTION_OBJECT_TYPE,
277  JS_ASYNC_GENERATOR_OBJECT_TYPE,
278  JS_CONTEXT_EXTENSION_OBJECT_TYPE,
279  JS_DATE_TYPE,
280  JS_ERROR_TYPE,
281  JS_GENERATOR_OBJECT_TYPE,
282  JS_MAP_TYPE,
283  JS_MAP_KEY_ITERATOR_TYPE,
284  JS_MAP_KEY_VALUE_ITERATOR_TYPE,
285  JS_MAP_VALUE_ITERATOR_TYPE,
286  JS_MESSAGE_OBJECT_TYPE,
287  JS_PROMISE_TYPE,
288  JS_REGEXP_TYPE,
289  JS_REGEXP_STRING_ITERATOR_TYPE,
290  JS_SET_TYPE,
291  JS_SET_KEY_VALUE_ITERATOR_TYPE,
292  JS_SET_VALUE_ITERATOR_TYPE,
293  JS_STRING_ITERATOR_TYPE,
294  JS_WEAK_CELL_TYPE, // FIRST_JS_WEAK_CELL_TYPE
295  JS_WEAK_REF_TYPE, // LAST_JS_WEAK_CELL_TYPE
296  JS_WEAK_FACTORY_CLEANUP_ITERATOR_TYPE,
297  JS_WEAK_FACTORY_TYPE,
298  JS_WEAK_MAP_TYPE,
299  JS_WEAK_SET_TYPE,
300 
301  JS_TYPED_ARRAY_TYPE,
302  JS_DATA_VIEW_TYPE,
303 
304 #ifdef V8_INTL_SUPPORT
305  JS_INTL_V8_BREAK_ITERATOR_TYPE,
306  JS_INTL_COLLATOR_TYPE,
307  JS_INTL_DATE_TIME_FORMAT_TYPE,
308  JS_INTL_LIST_FORMAT_TYPE,
309  JS_INTL_LOCALE_TYPE,
310  JS_INTL_NUMBER_FORMAT_TYPE,
311  JS_INTL_PLURAL_RULES_TYPE,
312  JS_INTL_RELATIVE_TIME_FORMAT_TYPE,
313  JS_INTL_SEGMENT_ITERATOR_TYPE,
314  JS_INTL_SEGMENTER_TYPE,
315 #endif // V8_INTL_SUPPORT
316 
317  WASM_EXCEPTION_TYPE,
318  WASM_GLOBAL_TYPE,
319  WASM_INSTANCE_TYPE,
320  WASM_MEMORY_TYPE,
321  WASM_MODULE_TYPE,
322  WASM_TABLE_TYPE,
323  JS_BOUND_FUNCTION_TYPE,
324  JS_FUNCTION_TYPE, // LAST_JS_OBJECT_TYPE, LAST_JS_RECEIVER_TYPE
325 
326  // Pseudo-types
327  FIRST_TYPE = 0x0,
328  LAST_TYPE = JS_FUNCTION_TYPE,
329  FIRST_STRING_TYPE = FIRST_TYPE,
330  FIRST_NAME_TYPE = FIRST_STRING_TYPE,
331  LAST_NAME_TYPE = SYMBOL_TYPE,
332  FIRST_UNIQUE_NAME_TYPE = INTERNALIZED_STRING_TYPE,
333  LAST_UNIQUE_NAME_TYPE = SYMBOL_TYPE,
334  FIRST_NONSTRING_TYPE = SYMBOL_TYPE,
335  FIRST_PRIMITIVE_TYPE = FIRST_NAME_TYPE,
336  LAST_PRIMITIVE_TYPE = ODDBALL_TYPE,
337  FIRST_FUNCTION_TYPE = JS_BOUND_FUNCTION_TYPE,
338  LAST_FUNCTION_TYPE = JS_FUNCTION_TYPE,
339  // Boundaries for testing if given HeapObject is a subclass of FixedArray.
340  FIRST_FIXED_ARRAY_TYPE = FIXED_ARRAY_TYPE,
341  LAST_FIXED_ARRAY_TYPE = SCRIPT_CONTEXT_TABLE_TYPE,
342  // Boundaries for testing if given HeapObject is a subclass of HashTable
343  FIRST_HASH_TABLE_TYPE = HASH_TABLE_TYPE,
344  LAST_HASH_TABLE_TYPE = EPHEMERON_HASH_TABLE_TYPE,
345  // Boundaries for testing if given HeapObject is a subclass of Dictionary
346  FIRST_DICTIONARY_TYPE = ORDERED_HASH_MAP_TYPE,
347  LAST_DICTIONARY_TYPE = SIMPLE_NUMBER_DICTIONARY_TYPE,
348  // Boundaries for testing if given HeapObject is a subclass of WeakFixedArray.
349  FIRST_WEAK_FIXED_ARRAY_TYPE = WEAK_FIXED_ARRAY_TYPE,
350  LAST_WEAK_FIXED_ARRAY_TYPE = TRANSITION_ARRAY_TYPE,
351  // Boundaries for testing if given HeapObject is a Context
352  FIRST_CONTEXT_TYPE = AWAIT_CONTEXT_TYPE,
353  LAST_CONTEXT_TYPE = WITH_CONTEXT_TYPE,
354  // Boundaries for testing if given HeapObject is a subclass of Microtask.
355  FIRST_MICROTASK_TYPE = CALLABLE_TASK_TYPE,
356  LAST_MICROTASK_TYPE = WEAK_FACTORY_CLEANUP_JOB_TASK_TYPE,
357  // Boundaries for testing for a fixed typed array.
358  FIRST_FIXED_TYPED_ARRAY_TYPE = FIXED_INT8_ARRAY_TYPE,
359  LAST_FIXED_TYPED_ARRAY_TYPE = FIXED_BIGUINT64_ARRAY_TYPE,
360  // Boundary for promotion to old space.
361  LAST_DATA_TYPE = FILLER_TYPE,
362  // Boundary for objects represented as JSReceiver (i.e. JSObject or JSProxy).
363  // Note that there is no range for JSObject or JSProxy, since their subtypes
364  // are not continuous in this enum! The enum ranges instead reflect the
365  // external class names, where proxies are treated as either ordinary objects,
366  // or functions.
367  FIRST_JS_RECEIVER_TYPE = JS_PROXY_TYPE,
368  LAST_JS_RECEIVER_TYPE = LAST_TYPE,
369  // Boundaries for testing the types represented as JSObject
370  FIRST_JS_OBJECT_TYPE = JS_GLOBAL_OBJECT_TYPE,
371  LAST_JS_OBJECT_TYPE = LAST_TYPE,
372  // Boundary for testing JSReceivers that need special property lookup handling
373  LAST_SPECIAL_RECEIVER_TYPE = JS_SPECIAL_API_OBJECT_TYPE,
374  // Boundary case for testing JSReceivers that may have elements while having
375  // an empty fixed array as elements backing store. This is true for string
376  // wrappers.
377  LAST_CUSTOM_ELEMENTS_RECEIVER = JS_VALUE_TYPE,
378 
379  FIRST_SET_ITERATOR_TYPE = JS_SET_KEY_VALUE_ITERATOR_TYPE,
380  LAST_SET_ITERATOR_TYPE = JS_SET_VALUE_ITERATOR_TYPE,
381 
382  FIRST_MAP_ITERATOR_TYPE = JS_MAP_KEY_ITERATOR_TYPE,
383  LAST_MAP_ITERATOR_TYPE = JS_MAP_VALUE_ITERATOR_TYPE,
384 
385  FIRST_JS_WEAK_CELL_TYPE = JS_WEAK_CELL_TYPE,
386  LAST_JS_WEAK_CELL_TYPE = JS_WEAK_REF_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(JSWeakFactory, JS_WEAK_FACTORY_TYPE) \
461  V(JSWeakFactoryCleanupIterator, JS_WEAK_FACTORY_CLEANUP_ITERATOR_TYPE) \
462  V(JSWeakMap, JS_WEAK_MAP_TYPE) \
463  V(JSWeakRef, JS_WEAK_REF_TYPE) \
464  V(JSWeakSet, JS_WEAK_SET_TYPE) \
465  V(LoadHandler, LOAD_HANDLER_TYPE) \
466  V(Map, MAP_TYPE) \
467  V(MutableHeapNumber, MUTABLE_HEAP_NUMBER_TYPE) \
468  V(NameDictionary, NAME_DICTIONARY_TYPE) \
469  V(NativeContext, NATIVE_CONTEXT_TYPE) \
470  V(NumberDictionary, NUMBER_DICTIONARY_TYPE) \
471  V(Oddball, ODDBALL_TYPE) \
472  V(OrderedHashMap, ORDERED_HASH_MAP_TYPE) \
473  V(OrderedHashSet, ORDERED_HASH_SET_TYPE) \
474  V(OrderedNameDictionary, ORDERED_NAME_DICTIONARY_TYPE) \
475  V(PreParsedScopeData, PRE_PARSED_SCOPE_DATA_TYPE) \
476  V(PropertyArray, PROPERTY_ARRAY_TYPE) \
477  V(PropertyCell, PROPERTY_CELL_TYPE) \
478  V(PropertyDescriptorObject, FIXED_ARRAY_TYPE) \
479  V(ScopeInfo, SCOPE_INFO_TYPE) \
480  V(ScriptContextTable, SCRIPT_CONTEXT_TABLE_TYPE) \
481  V(SharedFunctionInfo, SHARED_FUNCTION_INFO_TYPE) \
482  V(SimpleNumberDictionary, SIMPLE_NUMBER_DICTIONARY_TYPE) \
483  V(SmallOrderedHashMap, SMALL_ORDERED_HASH_MAP_TYPE) \
484  V(SmallOrderedHashSet, SMALL_ORDERED_HASH_SET_TYPE) \
485  V(SmallOrderedNameDictionary, SMALL_ORDERED_NAME_DICTIONARY_TYPE) \
486  V(SourcePositionTableWithFrameCache, TUPLE2_TYPE) \
487  V(StoreHandler, STORE_HANDLER_TYPE) \
488  V(StringTable, STRING_TABLE_TYPE) \
489  V(Symbol, SYMBOL_TYPE) \
490  V(TemplateObjectDescription, TUPLE2_TYPE) \
491  V(TransitionArray, TRANSITION_ARRAY_TYPE) \
492  V(UncompiledDataWithoutPreParsedScope, \
493  UNCOMPILED_DATA_WITHOUT_PRE_PARSED_SCOPE_TYPE) \
494  V(UncompiledDataWithPreParsedScope, \
495  UNCOMPILED_DATA_WITH_PRE_PARSED_SCOPE_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 #ifdef V8_INTL_SUPPORT
504 
505 #define INSTANCE_TYPE_CHECKERS_SINGLE(V) \
506  INSTANCE_TYPE_CHECKERS_SINGLE_BASE(V) \
507  V(JSV8BreakIterator, JS_INTL_V8_BREAK_ITERATOR_TYPE) \
508  V(JSCollator, JS_INTL_COLLATOR_TYPE) \
509  V(JSDateTimeFormat, JS_INTL_DATE_TIME_FORMAT_TYPE) \
510  V(JSListFormat, JS_INTL_LIST_FORMAT_TYPE) \
511  V(JSLocale, JS_INTL_LOCALE_TYPE) \
512  V(JSNumberFormat, JS_INTL_NUMBER_FORMAT_TYPE) \
513  V(JSPluralRules, JS_INTL_PLURAL_RULES_TYPE) \
514  V(JSRelativeTimeFormat, JS_INTL_RELATIVE_TIME_FORMAT_TYPE) \
515  V(JSSegmentIterator, JS_INTL_SEGMENT_ITERATOR_TYPE) \
516  V(JSSegmenter, JS_INTL_SEGMENTER_TYPE)
517 
518 #else
519 
520 #define INSTANCE_TYPE_CHECKERS_SINGLE(V) INSTANCE_TYPE_CHECKERS_SINGLE_BASE(V)
521 
522 #endif // V8_INTL_SUPPORT
523 
524 #define INSTANCE_TYPE_CHECKERS_RANGE(V) \
525  V(Context, FIRST_CONTEXT_TYPE, LAST_CONTEXT_TYPE) \
526  V(Dictionary, FIRST_DICTIONARY_TYPE, LAST_DICTIONARY_TYPE) \
527  V(FixedArray, FIRST_FIXED_ARRAY_TYPE, LAST_FIXED_ARRAY_TYPE) \
528  V(FixedTypedArrayBase, FIRST_FIXED_TYPED_ARRAY_TYPE, \
529  LAST_FIXED_TYPED_ARRAY_TYPE) \
530  V(HashTable, FIRST_HASH_TABLE_TYPE, LAST_HASH_TABLE_TYPE) \
531  V(JSMapIterator, FIRST_MAP_ITERATOR_TYPE, LAST_MAP_ITERATOR_TYPE) \
532  V(JSSetIterator, FIRST_SET_ITERATOR_TYPE, LAST_SET_ITERATOR_TYPE) \
533  V(JSWeakCell, FIRST_JS_WEAK_CELL_TYPE, LAST_JS_WEAK_CELL_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_
Definition: libplatform.h:13