1 /*
2  * Copyright (c) 2021-2022 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #ifndef ECMASCRIPT_MEM_OBJECT_XRAY_H
17 #define ECMASCRIPT_MEM_OBJECT_XRAY_H
18 
19 #include <cstdint>
20 
21 #include "ecmascript/byte_array.h"
22 #include "ecmascript/ecma_vm.h"
23 #include "ecmascript/js_async_from_sync_iterator.h"
24 #include "ecmascript/global_env.h"
25 #include "ecmascript/ic/ic_handler.h"
26 #include "ecmascript/ic/profile_type_info.h"
27 #include "ecmascript/ic/proto_change_details.h"
28 #include "ecmascript/jobs/micro_job_queue.h"
29 #include "ecmascript/jobs/pending_job.h"
30 #include "ecmascript/jspandafile/class_info_extractor.h"
31 #include "ecmascript/jspandafile/class_literal.h"
32 #include "ecmascript/jspandafile/program_object.h"
33 #include "ecmascript/js_api/js_api_arraylist.h"
34 #include "ecmascript/js_api/js_api_arraylist_iterator.h"
35 #include "ecmascript/js_api/js_api_bitvector.h"
36 #include "ecmascript/js_api/js_api_bitvector_iterator.h"
37 #include "ecmascript/js_api/js_api_deque.h"
38 #include "ecmascript/js_api/js_api_deque_iterator.h"
39 #include "ecmascript/js_api/js_api_hashmap.h"
40 #include "ecmascript/js_api/js_api_hashmap_iterator.h"
41 #include "ecmascript/js_api/js_api_hashset.h"
42 #include "ecmascript/js_api/js_api_hashset_iterator.h"
43 #include "ecmascript/js_api/js_api_lightweightmap.h"
44 #include "ecmascript/js_api/js_api_lightweightmap_iterator.h"
45 #include "ecmascript/js_api/js_api_lightweightset.h"
46 #include "ecmascript/js_api/js_api_lightweightset_iterator.h"
47 #include "ecmascript/js_api/js_api_linked_list.h"
48 #include "ecmascript/js_api/js_api_linked_list_iterator.h"
49 #include "ecmascript/js_api/js_api_list.h"
50 #include "ecmascript/js_api/js_api_list_iterator.h"
51 #include "ecmascript/js_api/js_api_plain_array.h"
52 #include "ecmascript/js_api/js_api_plain_array_iterator.h"
53 #include "ecmascript/js_api/js_api_queue.h"
54 #include "ecmascript/js_api/js_api_queue_iterator.h"
55 #include "ecmascript/js_api/js_api_stack.h"
56 #include "ecmascript/js_api/js_api_stack_iterator.h"
57 #include "ecmascript/js_api/js_api_tree_map.h"
58 #include "ecmascript/js_api/js_api_tree_map_iterator.h"
59 #include "ecmascript/js_api/js_api_tree_set.h"
60 #include "ecmascript/js_api/js_api_tree_set_iterator.h"
61 #include "ecmascript/js_api/js_api_vector.h"
62 #include "ecmascript/js_api/js_api_vector_iterator.h"
63 #include "ecmascript/js_arguments.h"
64 #include "ecmascript/js_array.h"
65 #include "ecmascript/js_array_iterator.h"
66 #include "ecmascript/js_arraybuffer.h"
67 #include "ecmascript/js_async_function.h"
68 #include "ecmascript/js_async_generator_object.h"
69 #include "ecmascript/js_collator.h"
70 #include "ecmascript/js_dataview.h"
71 #include "ecmascript/js_date.h"
72 #include "ecmascript/js_date_time_format.h"
73 #include "ecmascript/js_for_in_iterator.h"
74 #include "ecmascript/js_finalization_registry.h"
75 #include "ecmascript/js_function.h"
76 #include "ecmascript/js_generator_object.h"
77 #include "ecmascript/js_hclass.h"
78 #include "ecmascript/js_intl.h"
79 #include "ecmascript/js_locale.h"
80 #include "ecmascript/js_map.h"
81 #include "ecmascript/js_map_iterator.h"
82 #include "ecmascript/js_number_format.h"
83 #include "ecmascript/js_object-inl.h"
84 #include "ecmascript/js_plural_rules.h"
85 #include "ecmascript/js_primitive_ref.h"
86 #include "ecmascript/js_promise.h"
87 #include "ecmascript/js_realm.h"
88 #include "ecmascript/js_regexp.h"
89 #include "ecmascript/js_regexp_iterator.h"
90 #include "ecmascript/js_relative_time_format.h"
91 #include "ecmascript/js_segmenter.h"
92 #include "ecmascript/js_segments.h"
93 #include "ecmascript/js_segment_iterator.h"
94 #include "ecmascript/js_set.h"
95 #include "ecmascript/js_displaynames.h"
96 #include "ecmascript/js_list_format.h"
97 #include "ecmascript/js_set_iterator.h"
98 #include "ecmascript/js_string_iterator.h"
99 #include "ecmascript/js_typed_array.h"
100 #include "ecmascript/js_weak_container.h"
101 #include "ecmascript/jspandafile/class_info_extractor.h"
102 #include "ecmascript/jspandafile/program_object.h"
103 #include "ecmascript/js_weak_ref.h"
104 #include "ecmascript/marker_cell.h"
105 #include "ecmascript/mem/machine_code.h"
106 #include "ecmascript/mem/mem.h"
107 #include "ecmascript/mem/slots.h"
108 #include "ecmascript/module/js_module_namespace.h"
109 #include "ecmascript/dfx/native_module_failure_info.h"
110 #include "ecmascript/module/js_module_source_text.h"
111 #include "ecmascript/module/js_shared_module.h"
112 #include "ecmascript/shared_objects/js_shared_array.h"
113 #include "ecmascript/shared_objects/js_sendable_arraybuffer.h"
114 #include "ecmascript/shared_objects/js_shared_array_iterator.h"
115 #include "ecmascript/shared_objects/js_shared_map.h"
116 #include "ecmascript/shared_objects/js_shared_map_iterator.h"
117 #include "ecmascript/shared_objects/js_shared_set.h"
118 #include "ecmascript/shared_objects/js_shared_set_iterator.h"
119 #include "ecmascript/shared_objects/js_shared_typed_array.h"
120 #include "ecmascript/tagged_node.h"
121 #include "ecmascript/require/js_cjs_module.h"
122 #include "ecmascript/require/js_cjs_require.h"
123 #include "ecmascript/require/js_cjs_exports.h"
124 
125 namespace panda::ecmascript {
126 class ObjectXRay {
127 public:
128     ObjectXRay() = default;
129     ~ObjectXRay() = default;
130 
VisitVMRoots(EcmaVM *vm, const RootVisitor &visitor, const RootRangeVisitor &rangeVisitor, const RootBaseAndDerivedVisitor &derivedVisitor, VMRootVisitType type)131     static inline void VisitVMRoots(EcmaVM *vm, const RootVisitor &visitor, const RootRangeVisitor &rangeVisitor,
132         const RootBaseAndDerivedVisitor &derivedVisitor, VMRootVisitType type)
133     {
134         vm->Iterate(visitor, rangeVisitor, type);
135         vm->GetAssociatedJSThread()->Iterate(visitor, rangeVisitor, derivedVisitor);
136     }
137 
VisitJitCodeMap(EcmaVM *vm, const JitCodeMapVisitor &updater)138     static inline void VisitJitCodeMap(EcmaVM *vm, const JitCodeMapVisitor &updater)
139     {
140         vm->GetJSThread()->IterateJitCodeMap(updater);
141     }
142 
143     template<VisitType visitType>
VisitObjectBody(TaggedObject *object, JSHClass *klass, const EcmaObjectRangeVisitor &visitor)144     static inline void VisitObjectBody(TaggedObject *object, JSHClass *klass, const EcmaObjectRangeVisitor &visitor)
145     {
146         // handle body
147         JSType type = klass->GetObjectType();
148         switch (type) {
149             case JSType::JS_OBJECT:
150             case JSType::JS_ERROR:
151             case JSType::JS_EVAL_ERROR:
152             case JSType::JS_RANGE_ERROR:
153             case JSType::JS_REFERENCE_ERROR:
154             case JSType::JS_TYPE_ERROR:
155             case JSType::JS_AGGREGATE_ERROR:
156             case JSType::JS_URI_ERROR:
157             case JSType::JS_SYNTAX_ERROR:
158             case JSType::JS_OOM_ERROR:
159             case JSType::JS_TERMINATION_ERROR:
160             case JSType::JS_ASYNCITERATOR:
161             case JSType::JS_ITERATOR:
162                 JSObject::Cast(object)->VisitRangeSlot<visitType>(visitor);
163                 break;
164             case JSType::JS_SHARED_OBJECT: {
165                 auto jsSharedObject = JSSharedObject::Cast(object);
166                 jsSharedObject->VisitRangeSlot<visitType>(visitor);
167                 break;
168             }
169             case JSType::JS_ASYNC_FROM_SYNC_ITERATOR:
170                 JSAsyncFromSyncIterator::Cast(object)->VisitRangeSlot<visitType>(visitor);
171                 break;
172             case JSType::JS_GLOBAL_OBJECT:
173                 JSGlobalObject::Cast(object)->VisitRangeSlot<visitType>(visitor);
174                 break;
175             case JSType::JS_FUNCTION_BASE: {
176                 auto jsFunctionBase = JSFunctionBase::Cast(object);
177                 jsFunctionBase->VisitRangeSlot<visitType>(visitor);
178                 break;
179             }
180             case JSType::JS_FUNCTION: {
181                 auto jsFunction = JSFunction::Cast(object);
182                 jsFunction->VisitRangeSlot<visitType>(visitor);
183                 break;
184             }
185             case JSType::JS_SHARED_FUNCTION: {
186                 auto jsSharedFunction = JSSharedFunction::Cast(object);
187                 jsSharedFunction->VisitRangeSlot<visitType>(visitor);
188                 break;
189             }
190             case JSType::JS_GENERATOR_FUNCTION: {
191                 auto jsGeneratorFunction = JSGeneratorFunction::Cast(object);
192                 jsGeneratorFunction->VisitRangeSlot<visitType>(visitor);
193                 break;
194             }
195             case JSType::JS_ASYNC_GENERATOR_FUNCTION: {
196                 auto jsGeneratorFunction = JSAsyncGeneratorFunction::Cast(object);
197                 jsGeneratorFunction->VisitRangeSlot<visitType>(visitor);
198                 break;
199             }
200             case JSType::JS_PROXY_REVOC_FUNCTION: {
201                 auto jsProxyRevocFunction = JSProxyRevocFunction::Cast(object);
202                 jsProxyRevocFunction->VisitRangeSlot<visitType>(visitor);
203                 break;
204             }
205             case JSType::JS_PROMISE_REACTIONS_FUNCTION: {
206                 auto jsPromiseReactionsFunction = JSPromiseReactionsFunction::Cast(object);
207                 jsPromiseReactionsFunction->VisitRangeSlot<visitType>(visitor);
208                 break;
209             }
210             case JSType::JS_PROMISE_EXECUTOR_FUNCTION: {
211                 auto jsPromiseExecutorFunction = JSPromiseExecutorFunction::Cast(object);
212                 jsPromiseExecutorFunction->VisitRangeSlot<visitType>(visitor);
213                 break;
214             }
215             case JSType::JS_ASYNC_MODULE_FULFILLED_FUNCTION: {
216                 auto jsAsyncModuleFulfilledFunction = JSAsyncModuleFulfilledFunction::Cast(object);
217                 jsAsyncModuleFulfilledFunction->VisitRangeSlot<visitType>(visitor);
218                 break;
219             }
220             case JSType::JS_ASYNC_MODULE_REJECTED_FUNCTION: {
221                 auto jsAsyncModuleRejectedFunction = JSAsyncModuleRejectedFunction::Cast(object);
222                 jsAsyncModuleRejectedFunction->VisitRangeSlot<visitType>(visitor);
223                 break;
224             }
225             case JSType::JS_ASYNC_FROM_SYNC_ITER_UNWARP_FUNCTION: {
226                 auto jsAsyncFromSyncIterUnwarpFunction = JSAsyncFromSyncIterUnwarpFunction::Cast(object);
227                 jsAsyncFromSyncIterUnwarpFunction->VisitRangeSlot<visitType>(visitor);
228                 break;
229             }
230             case JSType::JS_PROMISE_ALL_RESOLVE_ELEMENT_FUNCTION: {
231                 auto jsPromiseAllResolveElementFunction = JSPromiseAllResolveElementFunction::Cast(object);
232                 jsPromiseAllResolveElementFunction->VisitRangeSlot<visitType>(visitor);
233                 break;
234             }
235             case JSType::JS_ASYNC_GENERATOR_RESUME_NEXT_RETURN_PROCESSOR_RST_FTN: {
236                 auto jsAsyGeneratorRseNextRtnProRstFtn = JSAsyncGeneratorResNextRetProRstFtn::Cast(object);
237                 jsAsyGeneratorRseNextRtnProRstFtn->VisitRangeSlot<visitType>(visitor);
238                 break;
239             }
240             case JSType::JS_PROMISE_ANY_REJECT_ELEMENT_FUNCTION: {
241                 auto jsPromiseAnyRejectElementFunction = JSPromiseAnyRejectElementFunction::Cast(object);
242                 jsPromiseAnyRejectElementFunction->VisitRangeSlot<visitType>(visitor);
243                 break;
244             }
245             case JSType::JS_PROMISE_ALL_SETTLED_ELEMENT_FUNCTION: {
246                 auto jsPromiseAllSettledElementFunction = JSPromiseAllSettledElementFunction::Cast(object);
247                 jsPromiseAllSettledElementFunction->VisitRangeSlot<visitType>(visitor);
248                 break;
249             }
250             case JSType::JS_PROMISE_FINALLY_FUNCTION: {
251                 auto jsPromiseFinallyFunction = JSPromiseFinallyFunction::Cast(object);
252                 jsPromiseFinallyFunction->VisitRangeSlot<visitType>(visitor);
253                 break;
254             }
255             case JSType::JS_PROMISE_VALUE_THUNK_OR_THROWER_FUNCTION: {
256                 auto jsPromiseValueThunkOrThrowerFunction = JSPromiseValueThunkOrThrowerFunction::Cast(object);
257                 jsPromiseValueThunkOrThrowerFunction->VisitRangeSlot<visitType>(visitor);
258                 break;
259             }
260             case JSType::JS_ASYNC_FUNCTION:
261             case JSType::JS_SHARED_ASYNC_FUNCTION: {
262                 auto jsAsyncFunction = JSAsyncFunction::Cast(object);
263                 jsAsyncFunction->VisitRangeSlot<visitType>(visitor);
264                 break;
265             }
266             case JSType::JS_ASYNC_AWAIT_STATUS_FUNCTION: {
267                 auto jsAsyncAwaitStatusFunction = JSAsyncAwaitStatusFunction::Cast(object);
268                 jsAsyncAwaitStatusFunction->VisitRangeSlot<visitType>(visitor);
269                 break;
270             }
271             case JSType::JS_REG_EXP:
272                 JSRegExp::Cast(object)->VisitRangeSlot<visitType>(visitor);
273                 break;
274             case JSType::JS_SET:
275                 JSSet::Cast(object)->VisitRangeSlot<visitType>(visitor);
276                 break;
277             case JSType::JS_SHARED_SET:
278                 JSSharedSet::Cast(object)->VisitRangeSlot<visitType>(visitor);
279                 break;
280             case JSType::JS_MAP:
281                 JSMap::Cast(object)->VisitRangeSlot<visitType>(visitor);
282                 break;
283             case JSType::JS_SHARED_MAP:
284                 JSSharedMap::Cast(object)->VisitRangeSlot<visitType>(visitor);
285                 break;
286             case JSType::JS_WEAK_MAP:
287                 JSWeakMap::Cast(object)->VisitRangeSlot<visitType>(visitor);
288                 break;
289             case JSType::JS_WEAK_SET:
290                 JSWeakSet::Cast(object)->VisitRangeSlot<visitType>(visitor);
291                 break;
292             case JSType::JS_WEAK_REF:
293                 JSWeakRef::Cast(object)->VisitRangeSlot<visitType>(visitor);
294                 break;
295             case JSType::JS_FINALIZATION_REGISTRY:
296                 JSFinalizationRegistry::Cast(object)->VisitRangeSlot<visitType>(visitor);
297                 break;
298             case JSType::CELL_RECORD:
299                 CellRecord::Cast(object)->VisitRangeSlot<visitType>(visitor);
300                 break;
301             case JSType::JS_DATE:
302                 JSDate::Cast(object)->VisitRangeSlot<visitType>(visitor);
303                 break;
304             case JSType::JS_FORIN_ITERATOR:
305                 JSForInIterator::Cast(object)->VisitRangeSlot<visitType>(visitor);
306                 break;
307             case JSType::JS_MAP_ITERATOR:
308                 JSMapIterator::Cast(object)->VisitRangeSlot<visitType>(visitor);
309                 break;
310             case JSType::JS_SHARED_MAP_ITERATOR:
311                 JSSharedMapIterator::Cast(object)->VisitRangeSlot<visitType>(visitor);
312                 break;
313             case JSType::JS_SET_ITERATOR:
314                 JSSetIterator::Cast(object)->VisitRangeSlot<visitType>(visitor);
315                 break;
316             case JSType::JS_SHARED_SET_ITERATOR:
317                 JSSharedSetIterator::Cast(object)->VisitRangeSlot<visitType>(visitor);
318                 break;
319             case JSType::JS_REG_EXP_ITERATOR:
320                 JSRegExpIterator::Cast(object)->VisitRangeSlot<visitType>(visitor);
321                 break;
322             case JSType::JS_ARRAY_ITERATOR:
323                 JSArrayIterator::Cast(object)->VisitRangeSlot<visitType>(visitor);
324                 break;
325             case JSType::JS_SHARED_ARRAY_ITERATOR:
326                 JSSharedArrayIterator::Cast(object)->VisitRangeSlot<visitType>(visitor);
327                 break;
328             case JSType::JS_STRING_ITERATOR:
329                 JSStringIterator::Cast(object)->VisitRangeSlot<visitType>(visitor);
330                 break;
331             case JSType::JS_ARRAY_BUFFER:
332                 JSArrayBuffer::Cast(object)->VisitRangeSlot<visitType>(visitor);
333                 break;
334             case JSType::JS_SENDABLE_ARRAY_BUFFER:
335                 JSSendableArrayBuffer::Cast(object)->VisitRangeSlot<visitType>(visitor);
336                 break;
337             case JSType::JS_SHARED_ARRAY_BUFFER:
338                 JSArrayBuffer::Cast(object)->VisitRangeSlot<visitType>(visitor);
339                 break;
340             case JSType::JS_PROMISE:
341                 JSPromise::Cast(object)->VisitRangeSlot<visitType>(visitor);
342                 break;
343             case JSType::JS_DATA_VIEW:
344                 JSDataView::Cast(object)->VisitRangeSlot<visitType>(visitor);
345                 break;
346             case JSType::JS_BOUND_FUNCTION: {
347                 auto jsBoundFunction = JSBoundFunction::Cast(object);
348                 jsBoundFunction->VisitRangeSlot<visitType>(visitor);
349                 break;
350             }
351             case JSType::JS_ARGUMENTS:
352                 JSArguments::Cast(object)->VisitRangeSlot<visitType>(visitor);
353                 break;
354             case JSType::JS_GENERATOR_OBJECT:
355                 JSGeneratorObject::Cast(object)->VisitRangeSlot<visitType>(visitor);
356                 break;
357             case JSType::JS_ASYNC_GENERATOR_OBJECT:
358                 JSAsyncGeneratorObject::Cast(object)->VisitRangeSlot<visitType>(visitor);
359                 break;
360             case JSType::JS_ASYNC_FUNC_OBJECT:
361                 JSAsyncFuncObject::Cast(object)->VisitRangeSlot<visitType>(visitor);
362                 break;
363             case JSType::JS_ARRAY:
364                 JSArray::Cast(object)->VisitRangeSlot<visitType>(visitor);
365                 break;
366             case JSType::JS_SHARED_ARRAY:
367                 JSSharedArray::Cast(object)->VisitRangeSlot<visitType>(visitor);
368                 break;
369             case JSType::JS_TYPED_ARRAY:
370             case JSType::JS_INT8_ARRAY:
371             case JSType::JS_UINT8_ARRAY:
372             case JSType::JS_UINT8_CLAMPED_ARRAY:
373             case JSType::JS_INT16_ARRAY:
374             case JSType::JS_UINT16_ARRAY:
375             case JSType::JS_INT32_ARRAY:
376             case JSType::JS_UINT32_ARRAY:
377             case JSType::JS_FLOAT32_ARRAY:
378             case JSType::JS_FLOAT64_ARRAY:
379             case JSType::JS_BIGINT64_ARRAY:
380             case JSType::JS_BIGUINT64_ARRAY:
381                 JSTypedArray::Cast(object)->VisitRangeSlot<visitType>(visitor);
382                 break;
383             case JSType::JS_SHARED_TYPED_ARRAY:
384             case JSType::JS_SHARED_INT8_ARRAY:
385             case JSType::JS_SHARED_UINT8_ARRAY:
386             case JSType::JS_SHARED_UINT8_CLAMPED_ARRAY:
387             case JSType::JS_SHARED_INT16_ARRAY:
388             case JSType::JS_SHARED_UINT16_ARRAY:
389             case JSType::JS_SHARED_INT32_ARRAY:
390             case JSType::JS_SHARED_UINT32_ARRAY:
391             case JSType::JS_SHARED_FLOAT32_ARRAY:
392             case JSType::JS_SHARED_FLOAT64_ARRAY:
393             case JSType::JS_SHARED_BIGINT64_ARRAY:
394             case JSType::JS_SHARED_BIGUINT64_ARRAY:
395                 JSSharedTypedArray::Cast(object)->VisitRangeSlot<visitType>(visitor);
396                 break;
397             case JSType::BYTE_ARRAY:
398                 if constexpr (visitType == VisitType::ALL_VISIT) {
399                     ByteArray::Cast(object)->VisitRangeSlot<visitType>(visitor);
400                 }
401                 break;
402             case JSType::JS_PRIMITIVE_REF:
403                 JSPrimitiveRef::Cast(object)->VisitRangeSlot<visitType>(visitor);
404                 break;
405             case JSType::JS_PROXY: {
406                 auto jsProxy = JSProxy::Cast(object);
407                 jsProxy->VisitRangeSlot<visitType>(visitor);
408                 break;
409             }
410             case JSType::HCLASS:
411                 // semi gc is not needed to visit hclass
412                 if constexpr (visitType != VisitType::SEMI_GC_VISIT) {
413                     JSHClass::Cast(object)->VisitRangeSlot<visitType>(visitor);
414                 }
415                 break;
416             case JSType::LINE_STRING:
417                 if constexpr (visitType == VisitType::ALL_VISIT) {
418                     LineEcmaString::Cast(object)->VisitRangeSlot<visitType>(visitor);
419                 }
420                 break;
421             case JSType::CONSTANT_STRING:
422                 if constexpr (visitType == VisitType::ALL_VISIT) {
423                     ConstantString::Cast(object)->VisitRangeSlot<visitType>(visitor);
424                 }
425                 break;
426             case JSType::TREE_STRING:
427                 TreeEcmaString::Cast(object)->VisitRangeSlot<visitType>(visitor);
428                 break;
429             case JSType::SLICED_STRING:
430                 SlicedString::Cast(object)->VisitRangeSlot<visitType>(visitor);
431                 break;
432             case JSType::JS_NATIVE_POINTER:
433                 if constexpr ((visitType == VisitType::SNAPSHOT_VISIT) || (visitType == VisitType::ALL_VISIT)) {
434                     JSNativePointer::Cast(object)->VisitRangeSlot<visitType>(visitor);
435                 }
436                 break;
437             case JSType::PROFILE_TYPE_INFO_CELL_0:
438             case JSType::PROFILE_TYPE_INFO_CELL_1:
439             case JSType::PROFILE_TYPE_INFO_CELL_N:
440                 ProfileTypeInfoCell::Cast(object)->VisitRangeSlot<visitType>(visitor);
441                 break;
442             case JSType::FUNCTION_TEMPLATE:
443                 FunctionTemplate::Cast(object)->VisitRangeSlot<visitType>(visitor);
444                 break;
445             case JSType::EXTRA_PROFILE_TYPE_INFO:
446                 ExtraProfileTypeInfo::Cast(object)->VisitRangeSlot<visitType>(visitor);
447                 break;
448             case JSType::TAGGED_ARRAY:
449             case JSType::TAGGED_DICTIONARY:
450             case JSType::TEMPLATE_MAP:
451             case JSType::LEXICAL_ENV:
452             case JSType::SENDABLE_ENV:
453             case JSType::AOT_LITERAL_INFO:
454             case JSType::VTABLE:
455             case JSType::COW_TAGGED_ARRAY:
456                 TaggedArray::Cast(object)->VisitRangeSlot<visitType>(visitor);
457                 break;
458             case JSType::MUTANT_TAGGED_ARRAY:
459                 if constexpr (visitType == VisitType::ALL_VISIT) {
460                     MutantTaggedArray::Cast(object)->VisitRangeSlot<visitType>(visitor);
461                 }
462                 break;
463             case JSType::COW_MUTANT_TAGGED_ARRAY:
464                 if constexpr (visitType == VisitType::ALL_VISIT) {
465                     COWMutantTaggedArray::Cast(object)->VisitRangeSlot<visitType>(visitor);
466                 }
467                 break;
468             case JSType::CONSTANT_POOL:
469                 ConstantPool::Cast(object)->VisitRangeSlot<visitType>(visitor);
470                 break;
471             case JSType::PROFILE_TYPE_INFO:
472                 ProfileTypeInfo::Cast(object)->VisitRangeSlot<visitType>(visitor);
473                 break;
474             case JSType::GLOBAL_ENV:
475                 GlobalEnv::Cast(object)->VisitRangeSlot<visitType>(visitor);
476                 break;
477             case JSType::ACCESSOR_DATA:
478                 AccessorData::Cast(object)->VisitRangeSlot<visitType>(visitor);
479                 break;
480             case JSType::INTERNAL_ACCESSOR:
481                 if constexpr (visitType == VisitType::ALL_VISIT) {
482                     InternalAccessor::Cast(object)->VisitRangeSlot<visitType>(visitor);
483                 }
484                 break;
485             case JSType::SYMBOL:
486                 JSSymbol::Cast(object)->VisitRangeSlot<visitType>(visitor);
487                 break;
488             case JSType::JS_GENERATOR_CONTEXT:
489                 GeneratorContext::Cast(object)->VisitRangeSlot<visitType>(visitor);
490                 break;
491             case JSType::PROTOTYPE_HANDLER:
492                 PrototypeHandler::Cast(object)->VisitRangeSlot<visitType>(visitor);
493                 break;
494             case JSType::TRANSITION_HANDLER:
495                 TransitionHandler::Cast(object)->VisitRangeSlot<visitType>(visitor);
496                 break;
497             case JSType::TRANS_WITH_PROTO_HANDLER:
498                 TransWithProtoHandler::Cast(object)->VisitRangeSlot<visitType>(visitor);
499                 break;
500             case JSType::STORE_TS_HANDLER:
501                 StoreTSHandler::Cast(object)->VisitRangeSlot<visitType>(visitor);
502                 break;
503             case JSType::PROPERTY_BOX:
504                 PropertyBox::Cast(object)->VisitRangeSlot<visitType>(visitor);
505                 break;
506             case JSType::PROTO_CHANGE_MARKER:
507                 if constexpr (visitType == VisitType::ALL_VISIT) {
508                     ProtoChangeMarker::Cast(object)->VisitRangeSlot<visitType>(visitor);
509                 }
510                 break;
511             case JSType::MARKER_CELL:
512                 if constexpr (visitType == VisitType::ALL_VISIT) {
513                     MarkerCell::Cast(object)->VisitRangeSlot<visitType>(visitor);
514                 }
515                 break;
516             case JSType::TRACK_INFO:
517                 TrackInfo::Cast(object)->VisitRangeSlot<visitType>(visitor);
518                 break;
519             case JSType::PROTOTYPE_INFO:
520                 ProtoChangeDetails::Cast(object)->VisitRangeSlot<visitType>(visitor);
521                 break;
522             case JSType::PROMISE_CAPABILITY:
523                 PromiseCapability::Cast(object)->VisitRangeSlot<visitType>(visitor);
524                 break;
525             case JSType::ASYNC_GENERATOR_REQUEST:
526                 AsyncGeneratorRequest::Cast(object)->VisitRangeSlot<visitType>(visitor);
527                 break;
528             case JSType::ASYNC_ITERATOR_RECORD:
529                 AsyncIteratorRecord::Cast(object)->VisitRangeSlot<visitType>(visitor);
530                 break;
531             case JSType::PROMISE_RECORD:
532                 PromiseRecord::Cast(object)->VisitRangeSlot<visitType>(visitor);
533                 break;
534             case JSType::RESOLVING_FUNCTIONS_RECORD:
535                 ResolvingFunctionsRecord::Cast(object)->VisitRangeSlot<visitType>(visitor);
536                 break;
537             case JSType::PROMISE_REACTIONS:
538                 PromiseReaction::Cast(object)->VisitRangeSlot<visitType>(visitor);
539                 break;
540             case JSType::PROMISE_ITERATOR_RECORD:
541                 PromiseIteratorRecord::Cast(object)->VisitRangeSlot<visitType>(visitor);
542                 break;
543             case JSType::MICRO_JOB_QUEUE:
544                 job::MicroJobQueue::Cast(object)->VisitRangeSlot<visitType>(visitor);
545                 break;
546             case JSType::PENDING_JOB:
547                 job::PendingJob::Cast(object)->VisitRangeSlot<visitType>(visitor);
548                 break;
549             case JSType::COMPLETION_RECORD:
550                 CompletionRecord::Cast(object)->VisitRangeSlot<visitType>(visitor);
551                 break;
552             case JSType::PROGRAM:
553                 Program::Cast(object)->VisitRangeSlot<visitType>(visitor);
554                 break;
555             case JSType::JS_INTL:
556                 JSIntl::Cast(object)->VisitRangeSlot<visitType>(visitor);
557                 break;
558             case JSType::JS_NUMBER_FORMAT:
559                 JSNumberFormat::Cast(object)->VisitRangeSlot<visitType>(visitor);
560                 break;
561             case JSType::JS_LOCALE:
562                 JSLocale::Cast(object)->VisitRangeSlot<visitType>(visitor);
563                 break;
564             case JSType::JS_DATE_TIME_FORMAT:
565                 JSDateTimeFormat::Cast(object)->VisitRangeSlot<visitType>(visitor);
566                 break;
567             case JSType::JS_RELATIVE_TIME_FORMAT:
568                 JSRelativeTimeFormat::Cast(object)->VisitRangeSlot<visitType>(visitor);
569                 break;
570             case JSType::JS_INTL_BOUND_FUNCTION: {
571                 auto jsIntlBoundFunction = JSIntlBoundFunction::Cast(object);
572                 jsIntlBoundFunction->VisitRangeSlot<visitType>(visitor);
573                 break;
574             }
575             case JSType::JS_REALM:
576                 JSRealm::Cast(object)->VisitRangeSlot<visitType>(visitor);
577                 break;
578             case JSType::JS_COLLATOR:
579                 JSCollator::Cast(object)->VisitRangeSlot<visitType>(visitor);
580                 break;
581             case JSType::JS_PLURAL_RULES:
582                 JSPluralRules::Cast(object)->VisitRangeSlot<visitType>(visitor);
583                 break;
584             case JSType::JS_DISPLAYNAMES:
585                 JSDisplayNames::Cast(object)->VisitRangeSlot<visitType>(visitor);
586                 break;
587             case JSType::JS_SEGMENTER:
588                 JSSegmenter::Cast(object)->VisitRangeSlot<visitType>(visitor);
589                 break;
590             case JSType::JS_SEGMENTS:
591                 JSSegments::Cast(object)->VisitRangeSlot<visitType>(visitor);
592                 break;
593             case JSType::JS_SEGMENT_ITERATOR:
594                 JSSegmentIterator::Cast(object)->VisitRangeSlot<visitType>(visitor);
595                 break;
596             case JSType::JS_LIST_FORMAT:
597                 JSListFormat::Cast(object)->VisitRangeSlot<visitType>(visitor);
598                 break;
599             case JSType::MACHINE_CODE_OBJECT:
600                 MachineCode::Cast(object)->VisitRangeSlot<visitType>(visitor);
601                 break;
602             case JSType::CLASS_INFO_EXTRACTOR: {
603                 auto classInfoExtractor = ClassInfoExtractor::Cast(object);
604                 classInfoExtractor->VisitRangeSlot<visitType>(visitor);
605                 break;
606             }
607             case JSType::JS_API_QUEUE:
608                 JSAPIQueue::Cast(object)->VisitRangeSlot<visitType>(visitor);
609                 break;
610             case JSType::JS_API_QUEUE_ITERATOR:
611                 JSAPIQueueIterator::Cast(object)->VisitRangeSlot<visitType>(visitor);
612                 break;
613             case JSType::JS_API_ARRAY_LIST:
614                 JSAPIArrayList::Cast(object)->VisitRangeSlot<visitType>(visitor);
615                 break;
616             case JSType::JS_API_ARRAYLIST_ITERATOR:
617                 JSAPIArrayListIterator::Cast(object)->VisitRangeSlot<visitType>(visitor);
618                 break;
619             case JSType::JS_API_LIGHT_WEIGHT_MAP:
620                 JSAPILightWeightMap::Cast(object)->VisitRangeSlot<visitType>(visitor);
621                 break;
622             case JSType::JS_API_LIGHT_WEIGHT_MAP_ITERATOR:
623                 JSAPILightWeightMapIterator::Cast(object)->VisitRangeSlot<visitType>(visitor);
624                 break;
625             case JSType::JS_API_LIGHT_WEIGHT_SET:
626                 JSAPILightWeightSet::Cast(object)->VisitRangeSlot<visitType>(visitor);
627                 break;
628             case JSType::JS_API_LIGHT_WEIGHT_SET_ITERATOR:
629                 JSAPILightWeightSetIterator::Cast(object)->VisitRangeSlot<visitType>(visitor);
630                 break;
631             case JSType::RB_TREENODE:
632                 RBTreeNode::Cast(object)->VisitRangeSlot<visitType>(visitor);
633                 break;
634             case JSType::LINKED_NODE:
635                 LinkedNode::Cast(object)->VisitRangeSlot<visitType>(visitor);
636                 break;
637             case JSType::JS_API_HASH_MAP:
638                 JSAPIHashMap::Cast(object)->VisitRangeSlot<visitType>(visitor);
639                 break;
640             case JSType::JS_API_HASH_SET:
641                 JSAPIHashSet::Cast(object)->VisitRangeSlot<visitType>(visitor);
642                 break;
643             case JSType::JS_API_HASHMAP_ITERATOR:
644                 JSAPIHashMapIterator::Cast(object)->VisitRangeSlot<visitType>(visitor);
645                 break;
646             case JSType::JS_API_HASHSET_ITERATOR:
647                 JSAPIHashSetIterator::Cast(object)->VisitRangeSlot<visitType>(visitor);
648                 break;
649             case JSType::JS_API_TREE_MAP:
650                 JSAPITreeMap::Cast(object)->VisitRangeSlot<visitType>(visitor);
651                 break;
652             case JSType::JS_API_TREE_SET:
653                 JSAPITreeSet::Cast(object)->VisitRangeSlot<visitType>(visitor);
654                 break;
655             case JSType::JS_API_TREEMAP_ITERATOR:
656                 JSAPITreeMapIterator::Cast(object)->VisitRangeSlot<visitType>(visitor);
657                 break;
658             case JSType::JS_API_TREESET_ITERATOR:
659                 JSAPITreeSetIterator::Cast(object)->VisitRangeSlot<visitType>(visitor);
660                 break;
661             case JSType::JS_API_PLAIN_ARRAY:
662                 JSAPIPlainArray::Cast(object)->VisitRangeSlot<visitType>(visitor);
663                 break;
664             case JSType::JS_API_PLAIN_ARRAY_ITERATOR:
665                 JSAPIPlainArrayIterator::Cast(object)->VisitRangeSlot<visitType>(visitor);
666                 break;
667             case JSType::JS_API_DEQUE:
668                 JSAPIDeque::Cast(object)->VisitRangeSlot<visitType>(visitor);
669                 break;
670             case JSType::JS_API_DEQUE_ITERATOR:
671                 JSAPIDequeIterator::Cast(object)->VisitRangeSlot<visitType>(visitor);
672                 break;
673             case JSType::JS_API_STACK:
674                 JSAPIStack::Cast(object)->VisitRangeSlot<visitType>(visitor);
675                 break;
676             case JSType::JS_API_STACK_ITERATOR:
677                 JSAPIStackIterator::Cast(object)->VisitRangeSlot<visitType>(visitor);
678                 break;
679             case JSType::JS_API_VECTOR:
680                 JSAPIVector::Cast(object)->VisitRangeSlot<visitType>(visitor);
681                 break;
682             case JSType::JS_API_BITVECTOR:
683                 JSAPIBitVector::Cast(object)->VisitRangeSlot<visitType>(visitor);
684                 break;
685             case JSType::JS_API_VECTOR_ITERATOR:
686                 JSAPIVectorIterator::Cast(object)->VisitRangeSlot<visitType>(visitor);
687                 break;
688             case JSType::JS_API_BITVECTOR_ITERATOR:
689                 JSAPIBitVectorIterator::Cast(object)->VisitRangeSlot<visitType>(visitor);
690                 break;
691             case JSType::JS_API_LIST:
692                 JSAPIList::Cast(object)->VisitRangeSlot<visitType>(visitor);
693                 break;
694             case JSType::JS_API_LINKED_LIST:
695                 JSAPILinkedList::Cast(object)->VisitRangeSlot<visitType>(visitor);
696                 break;
697             case JSType::JS_API_LIST_ITERATOR:
698                 JSAPIListIterator::Cast(object)->VisitRangeSlot<visitType>(visitor);
699                 break;
700             case JSType::JS_API_LINKED_LIST_ITERATOR:
701                 JSAPILinkedListIterator::Cast(object)->VisitRangeSlot<visitType>(visitor);
702                 break;
703             case JSType::BIGINT:
704                 if constexpr (visitType == VisitType::ALL_VISIT) {
705                     BigInt::Cast(object)->VisitRangeSlot<visitType>(visitor);
706                 }
707                 break;
708             case JSType::SOURCE_TEXT_MODULE_RECORD:
709                 SourceTextModule::Cast(object)->VisitRangeSlot<visitType>(visitor);
710                 break;
711             case JSType::IMPORTENTRY_RECORD:
712                 ImportEntry::Cast(object)->VisitRangeSlot<visitType>(visitor);
713                 break;
714             case JSType::LOCAL_EXPORTENTRY_RECORD:
715                 LocalExportEntry::Cast(object)->VisitRangeSlot<visitType>(visitor);
716                 break;
717             case JSType::INDIRECT_EXPORTENTRY_RECORD:
718                 IndirectExportEntry::Cast(object)->VisitRangeSlot<visitType>(visitor);
719                 break;
720             case JSType::STAR_EXPORTENTRY_RECORD:
721                 StarExportEntry::Cast(object)->VisitRangeSlot<visitType>(visitor);
722                 break;
723             case JSType::RESOLVEDBINDING_RECORD:
724                 ResolvedBinding::Cast(object)->VisitRangeSlot<visitType>(visitor);
725                 break;
726             case JSType::RESOLVEDINDEXBINDING_RECORD:
727                 ResolvedIndexBinding::Cast(object)->VisitRangeSlot<visitType>(visitor);
728                 break;
729             case JSType::RESOLVEDRECORDINDEXBINDING_RECORD:
730                 ResolvedRecordIndexBinding::Cast(object)->VisitRangeSlot<visitType>(visitor);
731                 break;
732             case JSType::RESOLVEDRECORDBINDING_RECORD:
733                 ResolvedRecordBinding::Cast(object)->VisitRangeSlot<visitType>(visitor);
734                 break;
735             case JSType::JS_MODULE_NAMESPACE:
736                 ModuleNamespace::Cast(object)->VisitRangeSlot<visitType>(visitor);
737                 break;
738             case JSType::JS_CJS_EXPORTS:
739                 CjsExports::Cast(object)->VisitRangeSlot<visitType>(visitor);
740                 break;
741             case JSType::JS_CJS_MODULE:
742                 CjsModule::Cast(object)->VisitRangeSlot<visitType>(visitor);
743                 break;
744             case JSType::JS_CJS_REQUIRE:
745                 CjsRequire::Cast(object)->VisitRangeSlot<visitType>(visitor);
746                 break;
747             case JSType::METHOD:
748                 Method::Cast(object)->VisitRangeSlot<visitType>(visitor);
749                 break;
750             case JSType::CLASS_LITERAL:
751                 ClassLiteral::Cast(object)->VisitRangeSlot<visitType>(visitor);
752                 break;
753             case JSType::NATIVE_MODULE_FAILURE_INFO:
754                 NativeModuleFailureInfo::Cast(object)->VisitRangeSlot<visitType>(visitor);
755                 break;
756             default:
757                 LOG_ECMA(FATAL) << "this branch is unreachable, type: " << static_cast<size_t>(type);
758                 UNREACHABLE();
759         }
760     }
761 };
762 }  // namespace panda::ecmascript
763 
764 #endif  // ECMASCRIPT_MEM_OBJECT_XRAY_H
765