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