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