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_
|