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 (bits 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 = ~((1 << 7) - 1); |
21 | const 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. |
25 | const uint32_t kStringRepresentationMask = (1 << 3) - 1; |
26 | enum StringRepresentationTag { |
27 | kSeqStringTag = 0x0, |
28 | kConsStringTag = 0x1, |
29 | kExternalStringTag = 0x2, |
30 | kSlicedStringTag = 0x3, |
31 | kThinStringTag = 0x5 |
32 | }; |
33 | const uint32_t kIsIndirectStringMask = 1 << 0; |
34 | const uint32_t kIsIndirectStringTag = 1 << 0; |
35 | STATIC_ASSERT((kSeqStringTag & kIsIndirectStringMask) == 0); |
36 | STATIC_ASSERT((kExternalStringTag & kIsIndirectStringMask) == 0); |
37 | STATIC_ASSERT((kConsStringTag & kIsIndirectStringMask) == kIsIndirectStringTag); |
38 | STATIC_ASSERT((kSlicedStringTag & kIsIndirectStringMask) == |
39 | kIsIndirectStringTag); |
40 | STATIC_ASSERT((kThinStringTag & kIsIndirectStringMask) == kIsIndirectStringTag); |
41 | |
42 | // For strings, bit 3 indicates whether the string consists of two-byte |
43 | // characters or one-byte characters. |
44 | const uint32_t kStringEncodingMask = 1 << 3; |
45 | const uint32_t kTwoByteStringTag = 0; |
46 | const 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. |
51 | const uint32_t kUncachedExternalStringMask = 1 << 4; |
52 | const 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). |
56 | const uint32_t kIsNotInternalizedMask = 1 << 5; |
57 | const uint32_t kNotInternalizedTag = 1 << 5; |
58 | const uint32_t kInternalizedTag = 0; |
59 | |
60 | // For strings, bit 6 indicates that the string is empty. |
61 | // TODO(bmeurer) |
62 | const uint32_t kIsEmptyStringMask = 1 << 6; |
63 | const uint32_t kIsEmptyStringTag = 1 << 6; |
64 | const 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. |
72 | const uint32_t kShortcutTypeMask = |
73 | kIsNotStringMask | kIsNotInternalizedMask | kStringRepresentationMask; |
74 | const uint32_t kShortcutTypeTag = kConsStringTag | kNotInternalizedTag; |
75 | |
76 | static inline bool IsShortcutCandidate(int type) { |
77 | return ((type & kShortcutTypeMask) == kShortcutTypeTag); |
78 | } |
79 | |
80 | enum 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. |
384 | constexpr InstanceType LAST_STRING_TYPE = |
385 | static_cast<InstanceType>(FIRST_NONSTRING_TYPE - 1); |
386 | |
387 | STATIC_ASSERT((FIRST_NONSTRING_TYPE & kIsNotStringMask) != kStringTag); |
388 | STATIC_ASSERT(JS_OBJECT_TYPE == Internals::kJSObjectType); |
389 | STATIC_ASSERT(JS_API_OBJECT_TYPE == Internals::kJSApiObjectType); |
390 | STATIC_ASSERT(JS_SPECIAL_API_OBJECT_TYPE == Internals::kJSSpecialApiObjectType); |
391 | STATIC_ASSERT(FIRST_NONSTRING_TYPE == Internals::kFirstNonstringType); |
392 | STATIC_ASSERT(ODDBALL_TYPE == Internals::kOddballType); |
393 | STATIC_ASSERT(FOREIGN_TYPE == Internals::kForeignType); |
394 | |
395 | V8_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 | |
544 | namespace InstanceTypeChecker { |
545 | #define IS_TYPE_FUNCTION_DECL(Type, ...) \ |
546 | V8_INLINE bool Is##Type(InstanceType instance_type); |
547 | |
548 | INSTANCE_TYPE_CHECKERS(IS_TYPE_FUNCTION_DECL) |
549 | |
550 | #define TYPED_ARRAY_IS_TYPE_FUNCTION_DECL(Type, ...) \ |
551 | IS_TYPE_FUNCTION_DECL(Fixed##Type##Array) |
552 | TYPED_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) |
557 | STRUCT_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 | |