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
125namespace panda::ecmascript {
126class ObjectXRay {
127public:
128    ObjectXRay() = default;
129    ~ObjectXRay() = default;
130
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
138    static inline void VisitJitCodeMap(EcmaVM *vm, const JitCodeMapVisitor &updater)
139    {
140        vm->GetJSThread()->IterateJitCodeMap(updater);
141    }
142
143    template<VisitType visitType>
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