14514f5e3Sopenharmony_ci/*
24514f5e3Sopenharmony_ci * Copyright (c) 2021-2022 Huawei Device Co., Ltd.
34514f5e3Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
44514f5e3Sopenharmony_ci * you may not use this file except in compliance with the License.
54514f5e3Sopenharmony_ci * You may obtain a copy of the License at
64514f5e3Sopenharmony_ci *
74514f5e3Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
84514f5e3Sopenharmony_ci *
94514f5e3Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
104514f5e3Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
114514f5e3Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
124514f5e3Sopenharmony_ci * See the License for the specific language governing permissions and
134514f5e3Sopenharmony_ci * limitations under the License.
144514f5e3Sopenharmony_ci */
154514f5e3Sopenharmony_ci
164514f5e3Sopenharmony_ci#ifndef ECMASCRIPT_MEM_OBJECT_XRAY_H
174514f5e3Sopenharmony_ci#define ECMASCRIPT_MEM_OBJECT_XRAY_H
184514f5e3Sopenharmony_ci
194514f5e3Sopenharmony_ci#include <cstdint>
204514f5e3Sopenharmony_ci
214514f5e3Sopenharmony_ci#include "ecmascript/byte_array.h"
224514f5e3Sopenharmony_ci#include "ecmascript/ecma_vm.h"
234514f5e3Sopenharmony_ci#include "ecmascript/js_async_from_sync_iterator.h"
244514f5e3Sopenharmony_ci#include "ecmascript/global_env.h"
254514f5e3Sopenharmony_ci#include "ecmascript/ic/ic_handler.h"
264514f5e3Sopenharmony_ci#include "ecmascript/ic/profile_type_info.h"
274514f5e3Sopenharmony_ci#include "ecmascript/ic/proto_change_details.h"
284514f5e3Sopenharmony_ci#include "ecmascript/jobs/micro_job_queue.h"
294514f5e3Sopenharmony_ci#include "ecmascript/jobs/pending_job.h"
304514f5e3Sopenharmony_ci#include "ecmascript/jspandafile/class_info_extractor.h"
314514f5e3Sopenharmony_ci#include "ecmascript/jspandafile/class_literal.h"
324514f5e3Sopenharmony_ci#include "ecmascript/jspandafile/program_object.h"
334514f5e3Sopenharmony_ci#include "ecmascript/js_api/js_api_arraylist.h"
344514f5e3Sopenharmony_ci#include "ecmascript/js_api/js_api_arraylist_iterator.h"
354514f5e3Sopenharmony_ci#include "ecmascript/js_api/js_api_bitvector.h"
364514f5e3Sopenharmony_ci#include "ecmascript/js_api/js_api_bitvector_iterator.h"
374514f5e3Sopenharmony_ci#include "ecmascript/js_api/js_api_deque.h"
384514f5e3Sopenharmony_ci#include "ecmascript/js_api/js_api_deque_iterator.h"
394514f5e3Sopenharmony_ci#include "ecmascript/js_api/js_api_hashmap.h"
404514f5e3Sopenharmony_ci#include "ecmascript/js_api/js_api_hashmap_iterator.h"
414514f5e3Sopenharmony_ci#include "ecmascript/js_api/js_api_hashset.h"
424514f5e3Sopenharmony_ci#include "ecmascript/js_api/js_api_hashset_iterator.h"
434514f5e3Sopenharmony_ci#include "ecmascript/js_api/js_api_lightweightmap.h"
444514f5e3Sopenharmony_ci#include "ecmascript/js_api/js_api_lightweightmap_iterator.h"
454514f5e3Sopenharmony_ci#include "ecmascript/js_api/js_api_lightweightset.h"
464514f5e3Sopenharmony_ci#include "ecmascript/js_api/js_api_lightweightset_iterator.h"
474514f5e3Sopenharmony_ci#include "ecmascript/js_api/js_api_linked_list.h"
484514f5e3Sopenharmony_ci#include "ecmascript/js_api/js_api_linked_list_iterator.h"
494514f5e3Sopenharmony_ci#include "ecmascript/js_api/js_api_list.h"
504514f5e3Sopenharmony_ci#include "ecmascript/js_api/js_api_list_iterator.h"
514514f5e3Sopenharmony_ci#include "ecmascript/js_api/js_api_plain_array.h"
524514f5e3Sopenharmony_ci#include "ecmascript/js_api/js_api_plain_array_iterator.h"
534514f5e3Sopenharmony_ci#include "ecmascript/js_api/js_api_queue.h"
544514f5e3Sopenharmony_ci#include "ecmascript/js_api/js_api_queue_iterator.h"
554514f5e3Sopenharmony_ci#include "ecmascript/js_api/js_api_stack.h"
564514f5e3Sopenharmony_ci#include "ecmascript/js_api/js_api_stack_iterator.h"
574514f5e3Sopenharmony_ci#include "ecmascript/js_api/js_api_tree_map.h"
584514f5e3Sopenharmony_ci#include "ecmascript/js_api/js_api_tree_map_iterator.h"
594514f5e3Sopenharmony_ci#include "ecmascript/js_api/js_api_tree_set.h"
604514f5e3Sopenharmony_ci#include "ecmascript/js_api/js_api_tree_set_iterator.h"
614514f5e3Sopenharmony_ci#include "ecmascript/js_api/js_api_vector.h"
624514f5e3Sopenharmony_ci#include "ecmascript/js_api/js_api_vector_iterator.h"
634514f5e3Sopenharmony_ci#include "ecmascript/js_arguments.h"
644514f5e3Sopenharmony_ci#include "ecmascript/js_array.h"
654514f5e3Sopenharmony_ci#include "ecmascript/js_array_iterator.h"
664514f5e3Sopenharmony_ci#include "ecmascript/js_arraybuffer.h"
674514f5e3Sopenharmony_ci#include "ecmascript/js_async_function.h"
684514f5e3Sopenharmony_ci#include "ecmascript/js_async_generator_object.h"
694514f5e3Sopenharmony_ci#include "ecmascript/js_collator.h"
704514f5e3Sopenharmony_ci#include "ecmascript/js_dataview.h"
714514f5e3Sopenharmony_ci#include "ecmascript/js_date.h"
724514f5e3Sopenharmony_ci#include "ecmascript/js_date_time_format.h"
734514f5e3Sopenharmony_ci#include "ecmascript/js_for_in_iterator.h"
744514f5e3Sopenharmony_ci#include "ecmascript/js_finalization_registry.h"
754514f5e3Sopenharmony_ci#include "ecmascript/js_function.h"
764514f5e3Sopenharmony_ci#include "ecmascript/js_generator_object.h"
774514f5e3Sopenharmony_ci#include "ecmascript/js_hclass.h"
784514f5e3Sopenharmony_ci#include "ecmascript/js_intl.h"
794514f5e3Sopenharmony_ci#include "ecmascript/js_locale.h"
804514f5e3Sopenharmony_ci#include "ecmascript/js_map.h"
814514f5e3Sopenharmony_ci#include "ecmascript/js_map_iterator.h"
824514f5e3Sopenharmony_ci#include "ecmascript/js_number_format.h"
834514f5e3Sopenharmony_ci#include "ecmascript/js_object-inl.h"
844514f5e3Sopenharmony_ci#include "ecmascript/js_plural_rules.h"
854514f5e3Sopenharmony_ci#include "ecmascript/js_primitive_ref.h"
864514f5e3Sopenharmony_ci#include "ecmascript/js_promise.h"
874514f5e3Sopenharmony_ci#include "ecmascript/js_realm.h"
884514f5e3Sopenharmony_ci#include "ecmascript/js_regexp.h"
894514f5e3Sopenharmony_ci#include "ecmascript/js_regexp_iterator.h"
904514f5e3Sopenharmony_ci#include "ecmascript/js_relative_time_format.h"
914514f5e3Sopenharmony_ci#include "ecmascript/js_segmenter.h"
924514f5e3Sopenharmony_ci#include "ecmascript/js_segments.h"
934514f5e3Sopenharmony_ci#include "ecmascript/js_segment_iterator.h"
944514f5e3Sopenharmony_ci#include "ecmascript/js_set.h"
954514f5e3Sopenharmony_ci#include "ecmascript/js_displaynames.h"
964514f5e3Sopenharmony_ci#include "ecmascript/js_list_format.h"
974514f5e3Sopenharmony_ci#include "ecmascript/js_set_iterator.h"
984514f5e3Sopenharmony_ci#include "ecmascript/js_string_iterator.h"
994514f5e3Sopenharmony_ci#include "ecmascript/js_typed_array.h"
1004514f5e3Sopenharmony_ci#include "ecmascript/js_weak_container.h"
1014514f5e3Sopenharmony_ci#include "ecmascript/jspandafile/class_info_extractor.h"
1024514f5e3Sopenharmony_ci#include "ecmascript/jspandafile/program_object.h"
1034514f5e3Sopenharmony_ci#include "ecmascript/js_weak_ref.h"
1044514f5e3Sopenharmony_ci#include "ecmascript/marker_cell.h"
1054514f5e3Sopenharmony_ci#include "ecmascript/mem/machine_code.h"
1064514f5e3Sopenharmony_ci#include "ecmascript/mem/mem.h"
1074514f5e3Sopenharmony_ci#include "ecmascript/mem/slots.h"
1084514f5e3Sopenharmony_ci#include "ecmascript/module/js_module_namespace.h"
1094514f5e3Sopenharmony_ci#include "ecmascript/dfx/native_module_failure_info.h"
1104514f5e3Sopenharmony_ci#include "ecmascript/module/js_module_source_text.h"
1114514f5e3Sopenharmony_ci#include "ecmascript/module/js_shared_module.h"
1124514f5e3Sopenharmony_ci#include "ecmascript/shared_objects/js_shared_array.h"
1134514f5e3Sopenharmony_ci#include "ecmascript/shared_objects/js_sendable_arraybuffer.h"
1144514f5e3Sopenharmony_ci#include "ecmascript/shared_objects/js_shared_array_iterator.h"
1154514f5e3Sopenharmony_ci#include "ecmascript/shared_objects/js_shared_map.h"
1164514f5e3Sopenharmony_ci#include "ecmascript/shared_objects/js_shared_map_iterator.h"
1174514f5e3Sopenharmony_ci#include "ecmascript/shared_objects/js_shared_set.h"
1184514f5e3Sopenharmony_ci#include "ecmascript/shared_objects/js_shared_set_iterator.h"
1194514f5e3Sopenharmony_ci#include "ecmascript/shared_objects/js_shared_typed_array.h"
1204514f5e3Sopenharmony_ci#include "ecmascript/tagged_node.h"
1214514f5e3Sopenharmony_ci#include "ecmascript/require/js_cjs_module.h"
1224514f5e3Sopenharmony_ci#include "ecmascript/require/js_cjs_require.h"
1234514f5e3Sopenharmony_ci#include "ecmascript/require/js_cjs_exports.h"
1244514f5e3Sopenharmony_ci
1254514f5e3Sopenharmony_cinamespace panda::ecmascript {
1264514f5e3Sopenharmony_ciclass ObjectXRay {
1274514f5e3Sopenharmony_cipublic:
1284514f5e3Sopenharmony_ci    ObjectXRay() = default;
1294514f5e3Sopenharmony_ci    ~ObjectXRay() = default;
1304514f5e3Sopenharmony_ci
1314514f5e3Sopenharmony_ci    static inline void VisitVMRoots(EcmaVM *vm, const RootVisitor &visitor, const RootRangeVisitor &rangeVisitor,
1324514f5e3Sopenharmony_ci        const RootBaseAndDerivedVisitor &derivedVisitor, VMRootVisitType type)
1334514f5e3Sopenharmony_ci    {
1344514f5e3Sopenharmony_ci        vm->Iterate(visitor, rangeVisitor, type);
1354514f5e3Sopenharmony_ci        vm->GetAssociatedJSThread()->Iterate(visitor, rangeVisitor, derivedVisitor);
1364514f5e3Sopenharmony_ci    }
1374514f5e3Sopenharmony_ci
1384514f5e3Sopenharmony_ci    static inline void VisitJitCodeMap(EcmaVM *vm, const JitCodeMapVisitor &updater)
1394514f5e3Sopenharmony_ci    {
1404514f5e3Sopenharmony_ci        vm->GetJSThread()->IterateJitCodeMap(updater);
1414514f5e3Sopenharmony_ci    }
1424514f5e3Sopenharmony_ci
1434514f5e3Sopenharmony_ci    template<VisitType visitType>
1444514f5e3Sopenharmony_ci    static inline void VisitObjectBody(TaggedObject *object, JSHClass *klass, const EcmaObjectRangeVisitor &visitor)
1454514f5e3Sopenharmony_ci    {
1464514f5e3Sopenharmony_ci        // handle body
1474514f5e3Sopenharmony_ci        JSType type = klass->GetObjectType();
1484514f5e3Sopenharmony_ci        switch (type) {
1494514f5e3Sopenharmony_ci            case JSType::JS_OBJECT:
1504514f5e3Sopenharmony_ci            case JSType::JS_ERROR:
1514514f5e3Sopenharmony_ci            case JSType::JS_EVAL_ERROR:
1524514f5e3Sopenharmony_ci            case JSType::JS_RANGE_ERROR:
1534514f5e3Sopenharmony_ci            case JSType::JS_REFERENCE_ERROR:
1544514f5e3Sopenharmony_ci            case JSType::JS_TYPE_ERROR:
1554514f5e3Sopenharmony_ci            case JSType::JS_AGGREGATE_ERROR:
1564514f5e3Sopenharmony_ci            case JSType::JS_URI_ERROR:
1574514f5e3Sopenharmony_ci            case JSType::JS_SYNTAX_ERROR:
1584514f5e3Sopenharmony_ci            case JSType::JS_OOM_ERROR:
1594514f5e3Sopenharmony_ci            case JSType::JS_TERMINATION_ERROR:
1604514f5e3Sopenharmony_ci            case JSType::JS_ASYNCITERATOR:
1614514f5e3Sopenharmony_ci            case JSType::JS_ITERATOR:
1624514f5e3Sopenharmony_ci                JSObject::Cast(object)->VisitRangeSlot<visitType>(visitor);
1634514f5e3Sopenharmony_ci                break;
1644514f5e3Sopenharmony_ci            case JSType::JS_SHARED_OBJECT: {
1654514f5e3Sopenharmony_ci                auto jsSharedObject = JSSharedObject::Cast(object);
1664514f5e3Sopenharmony_ci                jsSharedObject->VisitRangeSlot<visitType>(visitor);
1674514f5e3Sopenharmony_ci                break;
1684514f5e3Sopenharmony_ci            }
1694514f5e3Sopenharmony_ci            case JSType::JS_ASYNC_FROM_SYNC_ITERATOR:
1704514f5e3Sopenharmony_ci                JSAsyncFromSyncIterator::Cast(object)->VisitRangeSlot<visitType>(visitor);
1714514f5e3Sopenharmony_ci                break;
1724514f5e3Sopenharmony_ci            case JSType::JS_GLOBAL_OBJECT:
1734514f5e3Sopenharmony_ci                JSGlobalObject::Cast(object)->VisitRangeSlot<visitType>(visitor);
1744514f5e3Sopenharmony_ci                break;
1754514f5e3Sopenharmony_ci            case JSType::JS_FUNCTION_BASE: {
1764514f5e3Sopenharmony_ci                auto jsFunctionBase = JSFunctionBase::Cast(object);
1774514f5e3Sopenharmony_ci                jsFunctionBase->VisitRangeSlot<visitType>(visitor);
1784514f5e3Sopenharmony_ci                break;
1794514f5e3Sopenharmony_ci            }
1804514f5e3Sopenharmony_ci            case JSType::JS_FUNCTION: {
1814514f5e3Sopenharmony_ci                auto jsFunction = JSFunction::Cast(object);
1824514f5e3Sopenharmony_ci                jsFunction->VisitRangeSlot<visitType>(visitor);
1834514f5e3Sopenharmony_ci                break;
1844514f5e3Sopenharmony_ci            }
1854514f5e3Sopenharmony_ci            case JSType::JS_SHARED_FUNCTION: {
1864514f5e3Sopenharmony_ci                auto jsSharedFunction = JSSharedFunction::Cast(object);
1874514f5e3Sopenharmony_ci                jsSharedFunction->VisitRangeSlot<visitType>(visitor);
1884514f5e3Sopenharmony_ci                break;
1894514f5e3Sopenharmony_ci            }
1904514f5e3Sopenharmony_ci            case JSType::JS_GENERATOR_FUNCTION: {
1914514f5e3Sopenharmony_ci                auto jsGeneratorFunction = JSGeneratorFunction::Cast(object);
1924514f5e3Sopenharmony_ci                jsGeneratorFunction->VisitRangeSlot<visitType>(visitor);
1934514f5e3Sopenharmony_ci                break;
1944514f5e3Sopenharmony_ci            }
1954514f5e3Sopenharmony_ci            case JSType::JS_ASYNC_GENERATOR_FUNCTION: {
1964514f5e3Sopenharmony_ci                auto jsGeneratorFunction = JSAsyncGeneratorFunction::Cast(object);
1974514f5e3Sopenharmony_ci                jsGeneratorFunction->VisitRangeSlot<visitType>(visitor);
1984514f5e3Sopenharmony_ci                break;
1994514f5e3Sopenharmony_ci            }
2004514f5e3Sopenharmony_ci            case JSType::JS_PROXY_REVOC_FUNCTION: {
2014514f5e3Sopenharmony_ci                auto jsProxyRevocFunction = JSProxyRevocFunction::Cast(object);
2024514f5e3Sopenharmony_ci                jsProxyRevocFunction->VisitRangeSlot<visitType>(visitor);
2034514f5e3Sopenharmony_ci                break;
2044514f5e3Sopenharmony_ci            }
2054514f5e3Sopenharmony_ci            case JSType::JS_PROMISE_REACTIONS_FUNCTION: {
2064514f5e3Sopenharmony_ci                auto jsPromiseReactionsFunction = JSPromiseReactionsFunction::Cast(object);
2074514f5e3Sopenharmony_ci                jsPromiseReactionsFunction->VisitRangeSlot<visitType>(visitor);
2084514f5e3Sopenharmony_ci                break;
2094514f5e3Sopenharmony_ci            }
2104514f5e3Sopenharmony_ci            case JSType::JS_PROMISE_EXECUTOR_FUNCTION: {
2114514f5e3Sopenharmony_ci                auto jsPromiseExecutorFunction = JSPromiseExecutorFunction::Cast(object);
2124514f5e3Sopenharmony_ci                jsPromiseExecutorFunction->VisitRangeSlot<visitType>(visitor);
2134514f5e3Sopenharmony_ci                break;
2144514f5e3Sopenharmony_ci            }
2154514f5e3Sopenharmony_ci            case JSType::JS_ASYNC_MODULE_FULFILLED_FUNCTION: {
2164514f5e3Sopenharmony_ci                auto jsAsyncModuleFulfilledFunction = JSAsyncModuleFulfilledFunction::Cast(object);
2174514f5e3Sopenharmony_ci                jsAsyncModuleFulfilledFunction->VisitRangeSlot<visitType>(visitor);
2184514f5e3Sopenharmony_ci                break;
2194514f5e3Sopenharmony_ci            }
2204514f5e3Sopenharmony_ci            case JSType::JS_ASYNC_MODULE_REJECTED_FUNCTION: {
2214514f5e3Sopenharmony_ci                auto jsAsyncModuleRejectedFunction = JSAsyncModuleRejectedFunction::Cast(object);
2224514f5e3Sopenharmony_ci                jsAsyncModuleRejectedFunction->VisitRangeSlot<visitType>(visitor);
2234514f5e3Sopenharmony_ci                break;
2244514f5e3Sopenharmony_ci            }
2254514f5e3Sopenharmony_ci            case JSType::JS_ASYNC_FROM_SYNC_ITER_UNWARP_FUNCTION: {
2264514f5e3Sopenharmony_ci                auto jsAsyncFromSyncIterUnwarpFunction = JSAsyncFromSyncIterUnwarpFunction::Cast(object);
2274514f5e3Sopenharmony_ci                jsAsyncFromSyncIterUnwarpFunction->VisitRangeSlot<visitType>(visitor);
2284514f5e3Sopenharmony_ci                break;
2294514f5e3Sopenharmony_ci            }
2304514f5e3Sopenharmony_ci            case JSType::JS_PROMISE_ALL_RESOLVE_ELEMENT_FUNCTION: {
2314514f5e3Sopenharmony_ci                auto jsPromiseAllResolveElementFunction = JSPromiseAllResolveElementFunction::Cast(object);
2324514f5e3Sopenharmony_ci                jsPromiseAllResolveElementFunction->VisitRangeSlot<visitType>(visitor);
2334514f5e3Sopenharmony_ci                break;
2344514f5e3Sopenharmony_ci            }
2354514f5e3Sopenharmony_ci            case JSType::JS_ASYNC_GENERATOR_RESUME_NEXT_RETURN_PROCESSOR_RST_FTN: {
2364514f5e3Sopenharmony_ci                auto jsAsyGeneratorRseNextRtnProRstFtn = JSAsyncGeneratorResNextRetProRstFtn::Cast(object);
2374514f5e3Sopenharmony_ci                jsAsyGeneratorRseNextRtnProRstFtn->VisitRangeSlot<visitType>(visitor);
2384514f5e3Sopenharmony_ci                break;
2394514f5e3Sopenharmony_ci            }
2404514f5e3Sopenharmony_ci            case JSType::JS_PROMISE_ANY_REJECT_ELEMENT_FUNCTION: {
2414514f5e3Sopenharmony_ci                auto jsPromiseAnyRejectElementFunction = JSPromiseAnyRejectElementFunction::Cast(object);
2424514f5e3Sopenharmony_ci                jsPromiseAnyRejectElementFunction->VisitRangeSlot<visitType>(visitor);
2434514f5e3Sopenharmony_ci                break;
2444514f5e3Sopenharmony_ci            }
2454514f5e3Sopenharmony_ci            case JSType::JS_PROMISE_ALL_SETTLED_ELEMENT_FUNCTION: {
2464514f5e3Sopenharmony_ci                auto jsPromiseAllSettledElementFunction = JSPromiseAllSettledElementFunction::Cast(object);
2474514f5e3Sopenharmony_ci                jsPromiseAllSettledElementFunction->VisitRangeSlot<visitType>(visitor);
2484514f5e3Sopenharmony_ci                break;
2494514f5e3Sopenharmony_ci            }
2504514f5e3Sopenharmony_ci            case JSType::JS_PROMISE_FINALLY_FUNCTION: {
2514514f5e3Sopenharmony_ci                auto jsPromiseFinallyFunction = JSPromiseFinallyFunction::Cast(object);
2524514f5e3Sopenharmony_ci                jsPromiseFinallyFunction->VisitRangeSlot<visitType>(visitor);
2534514f5e3Sopenharmony_ci                break;
2544514f5e3Sopenharmony_ci            }
2554514f5e3Sopenharmony_ci            case JSType::JS_PROMISE_VALUE_THUNK_OR_THROWER_FUNCTION: {
2564514f5e3Sopenharmony_ci                auto jsPromiseValueThunkOrThrowerFunction = JSPromiseValueThunkOrThrowerFunction::Cast(object);
2574514f5e3Sopenharmony_ci                jsPromiseValueThunkOrThrowerFunction->VisitRangeSlot<visitType>(visitor);
2584514f5e3Sopenharmony_ci                break;
2594514f5e3Sopenharmony_ci            }
2604514f5e3Sopenharmony_ci            case JSType::JS_ASYNC_FUNCTION:
2614514f5e3Sopenharmony_ci            case JSType::JS_SHARED_ASYNC_FUNCTION: {
2624514f5e3Sopenharmony_ci                auto jsAsyncFunction = JSAsyncFunction::Cast(object);
2634514f5e3Sopenharmony_ci                jsAsyncFunction->VisitRangeSlot<visitType>(visitor);
2644514f5e3Sopenharmony_ci                break;
2654514f5e3Sopenharmony_ci            }
2664514f5e3Sopenharmony_ci            case JSType::JS_ASYNC_AWAIT_STATUS_FUNCTION: {
2674514f5e3Sopenharmony_ci                auto jsAsyncAwaitStatusFunction = JSAsyncAwaitStatusFunction::Cast(object);
2684514f5e3Sopenharmony_ci                jsAsyncAwaitStatusFunction->VisitRangeSlot<visitType>(visitor);
2694514f5e3Sopenharmony_ci                break;
2704514f5e3Sopenharmony_ci            }
2714514f5e3Sopenharmony_ci            case JSType::JS_REG_EXP:
2724514f5e3Sopenharmony_ci                JSRegExp::Cast(object)->VisitRangeSlot<visitType>(visitor);
2734514f5e3Sopenharmony_ci                break;
2744514f5e3Sopenharmony_ci            case JSType::JS_SET:
2754514f5e3Sopenharmony_ci                JSSet::Cast(object)->VisitRangeSlot<visitType>(visitor);
2764514f5e3Sopenharmony_ci                break;
2774514f5e3Sopenharmony_ci            case JSType::JS_SHARED_SET:
2784514f5e3Sopenharmony_ci                JSSharedSet::Cast(object)->VisitRangeSlot<visitType>(visitor);
2794514f5e3Sopenharmony_ci                break;
2804514f5e3Sopenharmony_ci            case JSType::JS_MAP:
2814514f5e3Sopenharmony_ci                JSMap::Cast(object)->VisitRangeSlot<visitType>(visitor);
2824514f5e3Sopenharmony_ci                break;
2834514f5e3Sopenharmony_ci            case JSType::JS_SHARED_MAP:
2844514f5e3Sopenharmony_ci                JSSharedMap::Cast(object)->VisitRangeSlot<visitType>(visitor);
2854514f5e3Sopenharmony_ci                break;
2864514f5e3Sopenharmony_ci            case JSType::JS_WEAK_MAP:
2874514f5e3Sopenharmony_ci                JSWeakMap::Cast(object)->VisitRangeSlot<visitType>(visitor);
2884514f5e3Sopenharmony_ci                break;
2894514f5e3Sopenharmony_ci            case JSType::JS_WEAK_SET:
2904514f5e3Sopenharmony_ci                JSWeakSet::Cast(object)->VisitRangeSlot<visitType>(visitor);
2914514f5e3Sopenharmony_ci                break;
2924514f5e3Sopenharmony_ci            case JSType::JS_WEAK_REF:
2934514f5e3Sopenharmony_ci                JSWeakRef::Cast(object)->VisitRangeSlot<visitType>(visitor);
2944514f5e3Sopenharmony_ci                break;
2954514f5e3Sopenharmony_ci            case JSType::JS_FINALIZATION_REGISTRY:
2964514f5e3Sopenharmony_ci                JSFinalizationRegistry::Cast(object)->VisitRangeSlot<visitType>(visitor);
2974514f5e3Sopenharmony_ci                break;
2984514f5e3Sopenharmony_ci            case JSType::CELL_RECORD:
2994514f5e3Sopenharmony_ci                CellRecord::Cast(object)->VisitRangeSlot<visitType>(visitor);
3004514f5e3Sopenharmony_ci                break;
3014514f5e3Sopenharmony_ci            case JSType::JS_DATE:
3024514f5e3Sopenharmony_ci                JSDate::Cast(object)->VisitRangeSlot<visitType>(visitor);
3034514f5e3Sopenharmony_ci                break;
3044514f5e3Sopenharmony_ci            case JSType::JS_FORIN_ITERATOR:
3054514f5e3Sopenharmony_ci                JSForInIterator::Cast(object)->VisitRangeSlot<visitType>(visitor);
3064514f5e3Sopenharmony_ci                break;
3074514f5e3Sopenharmony_ci            case JSType::JS_MAP_ITERATOR:
3084514f5e3Sopenharmony_ci                JSMapIterator::Cast(object)->VisitRangeSlot<visitType>(visitor);
3094514f5e3Sopenharmony_ci                break;
3104514f5e3Sopenharmony_ci            case JSType::JS_SHARED_MAP_ITERATOR:
3114514f5e3Sopenharmony_ci                JSSharedMapIterator::Cast(object)->VisitRangeSlot<visitType>(visitor);
3124514f5e3Sopenharmony_ci                break;
3134514f5e3Sopenharmony_ci            case JSType::JS_SET_ITERATOR:
3144514f5e3Sopenharmony_ci                JSSetIterator::Cast(object)->VisitRangeSlot<visitType>(visitor);
3154514f5e3Sopenharmony_ci                break;
3164514f5e3Sopenharmony_ci            case JSType::JS_SHARED_SET_ITERATOR:
3174514f5e3Sopenharmony_ci                JSSharedSetIterator::Cast(object)->VisitRangeSlot<visitType>(visitor);
3184514f5e3Sopenharmony_ci                break;
3194514f5e3Sopenharmony_ci            case JSType::JS_REG_EXP_ITERATOR:
3204514f5e3Sopenharmony_ci                JSRegExpIterator::Cast(object)->VisitRangeSlot<visitType>(visitor);
3214514f5e3Sopenharmony_ci                break;
3224514f5e3Sopenharmony_ci            case JSType::JS_ARRAY_ITERATOR:
3234514f5e3Sopenharmony_ci                JSArrayIterator::Cast(object)->VisitRangeSlot<visitType>(visitor);
3244514f5e3Sopenharmony_ci                break;
3254514f5e3Sopenharmony_ci            case JSType::JS_SHARED_ARRAY_ITERATOR:
3264514f5e3Sopenharmony_ci                JSSharedArrayIterator::Cast(object)->VisitRangeSlot<visitType>(visitor);
3274514f5e3Sopenharmony_ci                break;
3284514f5e3Sopenharmony_ci            case JSType::JS_STRING_ITERATOR:
3294514f5e3Sopenharmony_ci                JSStringIterator::Cast(object)->VisitRangeSlot<visitType>(visitor);
3304514f5e3Sopenharmony_ci                break;
3314514f5e3Sopenharmony_ci            case JSType::JS_ARRAY_BUFFER:
3324514f5e3Sopenharmony_ci                JSArrayBuffer::Cast(object)->VisitRangeSlot<visitType>(visitor);
3334514f5e3Sopenharmony_ci                break;
3344514f5e3Sopenharmony_ci            case JSType::JS_SENDABLE_ARRAY_BUFFER:
3354514f5e3Sopenharmony_ci                JSSendableArrayBuffer::Cast(object)->VisitRangeSlot<visitType>(visitor);
3364514f5e3Sopenharmony_ci                break;
3374514f5e3Sopenharmony_ci            case JSType::JS_SHARED_ARRAY_BUFFER:
3384514f5e3Sopenharmony_ci                JSArrayBuffer::Cast(object)->VisitRangeSlot<visitType>(visitor);
3394514f5e3Sopenharmony_ci                break;
3404514f5e3Sopenharmony_ci            case JSType::JS_PROMISE:
3414514f5e3Sopenharmony_ci                JSPromise::Cast(object)->VisitRangeSlot<visitType>(visitor);
3424514f5e3Sopenharmony_ci                break;
3434514f5e3Sopenharmony_ci            case JSType::JS_DATA_VIEW:
3444514f5e3Sopenharmony_ci                JSDataView::Cast(object)->VisitRangeSlot<visitType>(visitor);
3454514f5e3Sopenharmony_ci                break;
3464514f5e3Sopenharmony_ci            case JSType::JS_BOUND_FUNCTION: {
3474514f5e3Sopenharmony_ci                auto jsBoundFunction = JSBoundFunction::Cast(object);
3484514f5e3Sopenharmony_ci                jsBoundFunction->VisitRangeSlot<visitType>(visitor);
3494514f5e3Sopenharmony_ci                break;
3504514f5e3Sopenharmony_ci            }
3514514f5e3Sopenharmony_ci            case JSType::JS_ARGUMENTS:
3524514f5e3Sopenharmony_ci                JSArguments::Cast(object)->VisitRangeSlot<visitType>(visitor);
3534514f5e3Sopenharmony_ci                break;
3544514f5e3Sopenharmony_ci            case JSType::JS_GENERATOR_OBJECT:
3554514f5e3Sopenharmony_ci                JSGeneratorObject::Cast(object)->VisitRangeSlot<visitType>(visitor);
3564514f5e3Sopenharmony_ci                break;
3574514f5e3Sopenharmony_ci            case JSType::JS_ASYNC_GENERATOR_OBJECT:
3584514f5e3Sopenharmony_ci                JSAsyncGeneratorObject::Cast(object)->VisitRangeSlot<visitType>(visitor);
3594514f5e3Sopenharmony_ci                break;
3604514f5e3Sopenharmony_ci            case JSType::JS_ASYNC_FUNC_OBJECT:
3614514f5e3Sopenharmony_ci                JSAsyncFuncObject::Cast(object)->VisitRangeSlot<visitType>(visitor);
3624514f5e3Sopenharmony_ci                break;
3634514f5e3Sopenharmony_ci            case JSType::JS_ARRAY:
3644514f5e3Sopenharmony_ci                JSArray::Cast(object)->VisitRangeSlot<visitType>(visitor);
3654514f5e3Sopenharmony_ci                break;
3664514f5e3Sopenharmony_ci            case JSType::JS_SHARED_ARRAY:
3674514f5e3Sopenharmony_ci                JSSharedArray::Cast(object)->VisitRangeSlot<visitType>(visitor);
3684514f5e3Sopenharmony_ci                break;
3694514f5e3Sopenharmony_ci            case JSType::JS_TYPED_ARRAY:
3704514f5e3Sopenharmony_ci            case JSType::JS_INT8_ARRAY:
3714514f5e3Sopenharmony_ci            case JSType::JS_UINT8_ARRAY:
3724514f5e3Sopenharmony_ci            case JSType::JS_UINT8_CLAMPED_ARRAY:
3734514f5e3Sopenharmony_ci            case JSType::JS_INT16_ARRAY:
3744514f5e3Sopenharmony_ci            case JSType::JS_UINT16_ARRAY:
3754514f5e3Sopenharmony_ci            case JSType::JS_INT32_ARRAY:
3764514f5e3Sopenharmony_ci            case JSType::JS_UINT32_ARRAY:
3774514f5e3Sopenharmony_ci            case JSType::JS_FLOAT32_ARRAY:
3784514f5e3Sopenharmony_ci            case JSType::JS_FLOAT64_ARRAY:
3794514f5e3Sopenharmony_ci            case JSType::JS_BIGINT64_ARRAY:
3804514f5e3Sopenharmony_ci            case JSType::JS_BIGUINT64_ARRAY:
3814514f5e3Sopenharmony_ci                JSTypedArray::Cast(object)->VisitRangeSlot<visitType>(visitor);
3824514f5e3Sopenharmony_ci                break;
3834514f5e3Sopenharmony_ci            case JSType::JS_SHARED_TYPED_ARRAY:
3844514f5e3Sopenharmony_ci            case JSType::JS_SHARED_INT8_ARRAY:
3854514f5e3Sopenharmony_ci            case JSType::JS_SHARED_UINT8_ARRAY:
3864514f5e3Sopenharmony_ci            case JSType::JS_SHARED_UINT8_CLAMPED_ARRAY:
3874514f5e3Sopenharmony_ci            case JSType::JS_SHARED_INT16_ARRAY:
3884514f5e3Sopenharmony_ci            case JSType::JS_SHARED_UINT16_ARRAY:
3894514f5e3Sopenharmony_ci            case JSType::JS_SHARED_INT32_ARRAY:
3904514f5e3Sopenharmony_ci            case JSType::JS_SHARED_UINT32_ARRAY:
3914514f5e3Sopenharmony_ci            case JSType::JS_SHARED_FLOAT32_ARRAY:
3924514f5e3Sopenharmony_ci            case JSType::JS_SHARED_FLOAT64_ARRAY:
3934514f5e3Sopenharmony_ci            case JSType::JS_SHARED_BIGINT64_ARRAY:
3944514f5e3Sopenharmony_ci            case JSType::JS_SHARED_BIGUINT64_ARRAY:
3954514f5e3Sopenharmony_ci                JSSharedTypedArray::Cast(object)->VisitRangeSlot<visitType>(visitor);
3964514f5e3Sopenharmony_ci                break;
3974514f5e3Sopenharmony_ci            case JSType::BYTE_ARRAY:
3984514f5e3Sopenharmony_ci                if constexpr (visitType == VisitType::ALL_VISIT) {
3994514f5e3Sopenharmony_ci                    ByteArray::Cast(object)->VisitRangeSlot<visitType>(visitor);
4004514f5e3Sopenharmony_ci                }
4014514f5e3Sopenharmony_ci                break;
4024514f5e3Sopenharmony_ci            case JSType::JS_PRIMITIVE_REF:
4034514f5e3Sopenharmony_ci                JSPrimitiveRef::Cast(object)->VisitRangeSlot<visitType>(visitor);
4044514f5e3Sopenharmony_ci                break;
4054514f5e3Sopenharmony_ci            case JSType::JS_PROXY: {
4064514f5e3Sopenharmony_ci                auto jsProxy = JSProxy::Cast(object);
4074514f5e3Sopenharmony_ci                jsProxy->VisitRangeSlot<visitType>(visitor);
4084514f5e3Sopenharmony_ci                break;
4094514f5e3Sopenharmony_ci            }
4104514f5e3Sopenharmony_ci            case JSType::HCLASS:
4114514f5e3Sopenharmony_ci                // semi gc is not needed to visit hclass
4124514f5e3Sopenharmony_ci                if constexpr (visitType != VisitType::SEMI_GC_VISIT) {
4134514f5e3Sopenharmony_ci                    JSHClass::Cast(object)->VisitRangeSlot<visitType>(visitor);
4144514f5e3Sopenharmony_ci                }
4154514f5e3Sopenharmony_ci                break;
4164514f5e3Sopenharmony_ci            case JSType::LINE_STRING:
4174514f5e3Sopenharmony_ci                if constexpr (visitType == VisitType::ALL_VISIT) {
4184514f5e3Sopenharmony_ci                    LineEcmaString::Cast(object)->VisitRangeSlot<visitType>(visitor);
4194514f5e3Sopenharmony_ci                }
4204514f5e3Sopenharmony_ci                break;
4214514f5e3Sopenharmony_ci            case JSType::CONSTANT_STRING:
4224514f5e3Sopenharmony_ci                if constexpr (visitType == VisitType::ALL_VISIT) {
4234514f5e3Sopenharmony_ci                    ConstantString::Cast(object)->VisitRangeSlot<visitType>(visitor);
4244514f5e3Sopenharmony_ci                }
4254514f5e3Sopenharmony_ci                break;
4264514f5e3Sopenharmony_ci            case JSType::TREE_STRING:
4274514f5e3Sopenharmony_ci                TreeEcmaString::Cast(object)->VisitRangeSlot<visitType>(visitor);
4284514f5e3Sopenharmony_ci                break;
4294514f5e3Sopenharmony_ci            case JSType::SLICED_STRING:
4304514f5e3Sopenharmony_ci                SlicedString::Cast(object)->VisitRangeSlot<visitType>(visitor);
4314514f5e3Sopenharmony_ci                break;
4324514f5e3Sopenharmony_ci            case JSType::JS_NATIVE_POINTER:
4334514f5e3Sopenharmony_ci                if constexpr ((visitType == VisitType::SNAPSHOT_VISIT) || (visitType == VisitType::ALL_VISIT)) {
4344514f5e3Sopenharmony_ci                    JSNativePointer::Cast(object)->VisitRangeSlot<visitType>(visitor);
4354514f5e3Sopenharmony_ci                }
4364514f5e3Sopenharmony_ci                break;
4374514f5e3Sopenharmony_ci            case JSType::PROFILE_TYPE_INFO_CELL_0:
4384514f5e3Sopenharmony_ci            case JSType::PROFILE_TYPE_INFO_CELL_1:
4394514f5e3Sopenharmony_ci            case JSType::PROFILE_TYPE_INFO_CELL_N:
4404514f5e3Sopenharmony_ci                ProfileTypeInfoCell::Cast(object)->VisitRangeSlot<visitType>(visitor);
4414514f5e3Sopenharmony_ci                break;
4424514f5e3Sopenharmony_ci            case JSType::FUNCTION_TEMPLATE:
4434514f5e3Sopenharmony_ci                FunctionTemplate::Cast(object)->VisitRangeSlot<visitType>(visitor);
4444514f5e3Sopenharmony_ci                break;
4454514f5e3Sopenharmony_ci            case JSType::EXTRA_PROFILE_TYPE_INFO:
4464514f5e3Sopenharmony_ci                ExtraProfileTypeInfo::Cast(object)->VisitRangeSlot<visitType>(visitor);
4474514f5e3Sopenharmony_ci                break;
4484514f5e3Sopenharmony_ci            case JSType::TAGGED_ARRAY:
4494514f5e3Sopenharmony_ci            case JSType::TAGGED_DICTIONARY:
4504514f5e3Sopenharmony_ci            case JSType::TEMPLATE_MAP:
4514514f5e3Sopenharmony_ci            case JSType::LEXICAL_ENV:
4524514f5e3Sopenharmony_ci            case JSType::SENDABLE_ENV:
4534514f5e3Sopenharmony_ci            case JSType::AOT_LITERAL_INFO:
4544514f5e3Sopenharmony_ci            case JSType::VTABLE:
4554514f5e3Sopenharmony_ci            case JSType::COW_TAGGED_ARRAY:
4564514f5e3Sopenharmony_ci                TaggedArray::Cast(object)->VisitRangeSlot<visitType>(visitor);
4574514f5e3Sopenharmony_ci                break;
4584514f5e3Sopenharmony_ci            case JSType::MUTANT_TAGGED_ARRAY:
4594514f5e3Sopenharmony_ci                if constexpr (visitType == VisitType::ALL_VISIT) {
4604514f5e3Sopenharmony_ci                    MutantTaggedArray::Cast(object)->VisitRangeSlot<visitType>(visitor);
4614514f5e3Sopenharmony_ci                }
4624514f5e3Sopenharmony_ci                break;
4634514f5e3Sopenharmony_ci            case JSType::COW_MUTANT_TAGGED_ARRAY:
4644514f5e3Sopenharmony_ci                if constexpr (visitType == VisitType::ALL_VISIT) {
4654514f5e3Sopenharmony_ci                    COWMutantTaggedArray::Cast(object)->VisitRangeSlot<visitType>(visitor);
4664514f5e3Sopenharmony_ci                }
4674514f5e3Sopenharmony_ci                break;
4684514f5e3Sopenharmony_ci            case JSType::CONSTANT_POOL:
4694514f5e3Sopenharmony_ci                ConstantPool::Cast(object)->VisitRangeSlot<visitType>(visitor);
4704514f5e3Sopenharmony_ci                break;
4714514f5e3Sopenharmony_ci            case JSType::PROFILE_TYPE_INFO:
4724514f5e3Sopenharmony_ci                ProfileTypeInfo::Cast(object)->VisitRangeSlot<visitType>(visitor);
4734514f5e3Sopenharmony_ci                break;
4744514f5e3Sopenharmony_ci            case JSType::GLOBAL_ENV:
4754514f5e3Sopenharmony_ci                GlobalEnv::Cast(object)->VisitRangeSlot<visitType>(visitor);
4764514f5e3Sopenharmony_ci                break;
4774514f5e3Sopenharmony_ci            case JSType::ACCESSOR_DATA:
4784514f5e3Sopenharmony_ci                AccessorData::Cast(object)->VisitRangeSlot<visitType>(visitor);
4794514f5e3Sopenharmony_ci                break;
4804514f5e3Sopenharmony_ci            case JSType::INTERNAL_ACCESSOR:
4814514f5e3Sopenharmony_ci                if constexpr (visitType == VisitType::ALL_VISIT) {
4824514f5e3Sopenharmony_ci                    InternalAccessor::Cast(object)->VisitRangeSlot<visitType>(visitor);
4834514f5e3Sopenharmony_ci                }
4844514f5e3Sopenharmony_ci                break;
4854514f5e3Sopenharmony_ci            case JSType::SYMBOL:
4864514f5e3Sopenharmony_ci                JSSymbol::Cast(object)->VisitRangeSlot<visitType>(visitor);
4874514f5e3Sopenharmony_ci                break;
4884514f5e3Sopenharmony_ci            case JSType::JS_GENERATOR_CONTEXT:
4894514f5e3Sopenharmony_ci                GeneratorContext::Cast(object)->VisitRangeSlot<visitType>(visitor);
4904514f5e3Sopenharmony_ci                break;
4914514f5e3Sopenharmony_ci            case JSType::PROTOTYPE_HANDLER:
4924514f5e3Sopenharmony_ci                PrototypeHandler::Cast(object)->VisitRangeSlot<visitType>(visitor);
4934514f5e3Sopenharmony_ci                break;
4944514f5e3Sopenharmony_ci            case JSType::TRANSITION_HANDLER:
4954514f5e3Sopenharmony_ci                TransitionHandler::Cast(object)->VisitRangeSlot<visitType>(visitor);
4964514f5e3Sopenharmony_ci                break;
4974514f5e3Sopenharmony_ci            case JSType::TRANS_WITH_PROTO_HANDLER:
4984514f5e3Sopenharmony_ci                TransWithProtoHandler::Cast(object)->VisitRangeSlot<visitType>(visitor);
4994514f5e3Sopenharmony_ci                break;
5004514f5e3Sopenharmony_ci            case JSType::STORE_TS_HANDLER:
5014514f5e3Sopenharmony_ci                StoreTSHandler::Cast(object)->VisitRangeSlot<visitType>(visitor);
5024514f5e3Sopenharmony_ci                break;
5034514f5e3Sopenharmony_ci            case JSType::PROPERTY_BOX:
5044514f5e3Sopenharmony_ci                PropertyBox::Cast(object)->VisitRangeSlot<visitType>(visitor);
5054514f5e3Sopenharmony_ci                break;
5064514f5e3Sopenharmony_ci            case JSType::PROTO_CHANGE_MARKER:
5074514f5e3Sopenharmony_ci                if constexpr (visitType == VisitType::ALL_VISIT) {
5084514f5e3Sopenharmony_ci                    ProtoChangeMarker::Cast(object)->VisitRangeSlot<visitType>(visitor);
5094514f5e3Sopenharmony_ci                }
5104514f5e3Sopenharmony_ci                break;
5114514f5e3Sopenharmony_ci            case JSType::MARKER_CELL:
5124514f5e3Sopenharmony_ci                if constexpr (visitType == VisitType::ALL_VISIT) {
5134514f5e3Sopenharmony_ci                    MarkerCell::Cast(object)->VisitRangeSlot<visitType>(visitor);
5144514f5e3Sopenharmony_ci                }
5154514f5e3Sopenharmony_ci                break;
5164514f5e3Sopenharmony_ci            case JSType::TRACK_INFO:
5174514f5e3Sopenharmony_ci                TrackInfo::Cast(object)->VisitRangeSlot<visitType>(visitor);
5184514f5e3Sopenharmony_ci                break;
5194514f5e3Sopenharmony_ci            case JSType::PROTOTYPE_INFO:
5204514f5e3Sopenharmony_ci                ProtoChangeDetails::Cast(object)->VisitRangeSlot<visitType>(visitor);
5214514f5e3Sopenharmony_ci                break;
5224514f5e3Sopenharmony_ci            case JSType::PROMISE_CAPABILITY:
5234514f5e3Sopenharmony_ci                PromiseCapability::Cast(object)->VisitRangeSlot<visitType>(visitor);
5244514f5e3Sopenharmony_ci                break;
5254514f5e3Sopenharmony_ci            case JSType::ASYNC_GENERATOR_REQUEST:
5264514f5e3Sopenharmony_ci                AsyncGeneratorRequest::Cast(object)->VisitRangeSlot<visitType>(visitor);
5274514f5e3Sopenharmony_ci                break;
5284514f5e3Sopenharmony_ci            case JSType::ASYNC_ITERATOR_RECORD:
5294514f5e3Sopenharmony_ci                AsyncIteratorRecord::Cast(object)->VisitRangeSlot<visitType>(visitor);
5304514f5e3Sopenharmony_ci                break;
5314514f5e3Sopenharmony_ci            case JSType::PROMISE_RECORD:
5324514f5e3Sopenharmony_ci                PromiseRecord::Cast(object)->VisitRangeSlot<visitType>(visitor);
5334514f5e3Sopenharmony_ci                break;
5344514f5e3Sopenharmony_ci            case JSType::RESOLVING_FUNCTIONS_RECORD:
5354514f5e3Sopenharmony_ci                ResolvingFunctionsRecord::Cast(object)->VisitRangeSlot<visitType>(visitor);
5364514f5e3Sopenharmony_ci                break;
5374514f5e3Sopenharmony_ci            case JSType::PROMISE_REACTIONS:
5384514f5e3Sopenharmony_ci                PromiseReaction::Cast(object)->VisitRangeSlot<visitType>(visitor);
5394514f5e3Sopenharmony_ci                break;
5404514f5e3Sopenharmony_ci            case JSType::PROMISE_ITERATOR_RECORD:
5414514f5e3Sopenharmony_ci                PromiseIteratorRecord::Cast(object)->VisitRangeSlot<visitType>(visitor);
5424514f5e3Sopenharmony_ci                break;
5434514f5e3Sopenharmony_ci            case JSType::MICRO_JOB_QUEUE:
5444514f5e3Sopenharmony_ci                job::MicroJobQueue::Cast(object)->VisitRangeSlot<visitType>(visitor);
5454514f5e3Sopenharmony_ci                break;
5464514f5e3Sopenharmony_ci            case JSType::PENDING_JOB:
5474514f5e3Sopenharmony_ci                job::PendingJob::Cast(object)->VisitRangeSlot<visitType>(visitor);
5484514f5e3Sopenharmony_ci                break;
5494514f5e3Sopenharmony_ci            case JSType::COMPLETION_RECORD:
5504514f5e3Sopenharmony_ci                CompletionRecord::Cast(object)->VisitRangeSlot<visitType>(visitor);
5514514f5e3Sopenharmony_ci                break;
5524514f5e3Sopenharmony_ci            case JSType::PROGRAM:
5534514f5e3Sopenharmony_ci                Program::Cast(object)->VisitRangeSlot<visitType>(visitor);
5544514f5e3Sopenharmony_ci                break;
5554514f5e3Sopenharmony_ci            case JSType::JS_INTL:
5564514f5e3Sopenharmony_ci                JSIntl::Cast(object)->VisitRangeSlot<visitType>(visitor);
5574514f5e3Sopenharmony_ci                break;
5584514f5e3Sopenharmony_ci            case JSType::JS_NUMBER_FORMAT:
5594514f5e3Sopenharmony_ci                JSNumberFormat::Cast(object)->VisitRangeSlot<visitType>(visitor);
5604514f5e3Sopenharmony_ci                break;
5614514f5e3Sopenharmony_ci            case JSType::JS_LOCALE:
5624514f5e3Sopenharmony_ci                JSLocale::Cast(object)->VisitRangeSlot<visitType>(visitor);
5634514f5e3Sopenharmony_ci                break;
5644514f5e3Sopenharmony_ci            case JSType::JS_DATE_TIME_FORMAT:
5654514f5e3Sopenharmony_ci                JSDateTimeFormat::Cast(object)->VisitRangeSlot<visitType>(visitor);
5664514f5e3Sopenharmony_ci                break;
5674514f5e3Sopenharmony_ci            case JSType::JS_RELATIVE_TIME_FORMAT:
5684514f5e3Sopenharmony_ci                JSRelativeTimeFormat::Cast(object)->VisitRangeSlot<visitType>(visitor);
5694514f5e3Sopenharmony_ci                break;
5704514f5e3Sopenharmony_ci            case JSType::JS_INTL_BOUND_FUNCTION: {
5714514f5e3Sopenharmony_ci                auto jsIntlBoundFunction = JSIntlBoundFunction::Cast(object);
5724514f5e3Sopenharmony_ci                jsIntlBoundFunction->VisitRangeSlot<visitType>(visitor);
5734514f5e3Sopenharmony_ci                break;
5744514f5e3Sopenharmony_ci            }
5754514f5e3Sopenharmony_ci            case JSType::JS_REALM:
5764514f5e3Sopenharmony_ci                JSRealm::Cast(object)->VisitRangeSlot<visitType>(visitor);
5774514f5e3Sopenharmony_ci                break;
5784514f5e3Sopenharmony_ci            case JSType::JS_COLLATOR:
5794514f5e3Sopenharmony_ci                JSCollator::Cast(object)->VisitRangeSlot<visitType>(visitor);
5804514f5e3Sopenharmony_ci                break;
5814514f5e3Sopenharmony_ci            case JSType::JS_PLURAL_RULES:
5824514f5e3Sopenharmony_ci                JSPluralRules::Cast(object)->VisitRangeSlot<visitType>(visitor);
5834514f5e3Sopenharmony_ci                break;
5844514f5e3Sopenharmony_ci            case JSType::JS_DISPLAYNAMES:
5854514f5e3Sopenharmony_ci                JSDisplayNames::Cast(object)->VisitRangeSlot<visitType>(visitor);
5864514f5e3Sopenharmony_ci                break;
5874514f5e3Sopenharmony_ci            case JSType::JS_SEGMENTER:
5884514f5e3Sopenharmony_ci                JSSegmenter::Cast(object)->VisitRangeSlot<visitType>(visitor);
5894514f5e3Sopenharmony_ci                break;
5904514f5e3Sopenharmony_ci            case JSType::JS_SEGMENTS:
5914514f5e3Sopenharmony_ci                JSSegments::Cast(object)->VisitRangeSlot<visitType>(visitor);
5924514f5e3Sopenharmony_ci                break;
5934514f5e3Sopenharmony_ci            case JSType::JS_SEGMENT_ITERATOR:
5944514f5e3Sopenharmony_ci                JSSegmentIterator::Cast(object)->VisitRangeSlot<visitType>(visitor);
5954514f5e3Sopenharmony_ci                break;
5964514f5e3Sopenharmony_ci            case JSType::JS_LIST_FORMAT:
5974514f5e3Sopenharmony_ci                JSListFormat::Cast(object)->VisitRangeSlot<visitType>(visitor);
5984514f5e3Sopenharmony_ci                break;
5994514f5e3Sopenharmony_ci            case JSType::MACHINE_CODE_OBJECT:
6004514f5e3Sopenharmony_ci                MachineCode::Cast(object)->VisitRangeSlot<visitType>(visitor);
6014514f5e3Sopenharmony_ci                break;
6024514f5e3Sopenharmony_ci            case JSType::CLASS_INFO_EXTRACTOR: {
6034514f5e3Sopenharmony_ci                auto classInfoExtractor = ClassInfoExtractor::Cast(object);
6044514f5e3Sopenharmony_ci                classInfoExtractor->VisitRangeSlot<visitType>(visitor);
6054514f5e3Sopenharmony_ci                break;
6064514f5e3Sopenharmony_ci            }
6074514f5e3Sopenharmony_ci            case JSType::JS_API_QUEUE:
6084514f5e3Sopenharmony_ci                JSAPIQueue::Cast(object)->VisitRangeSlot<visitType>(visitor);
6094514f5e3Sopenharmony_ci                break;
6104514f5e3Sopenharmony_ci            case JSType::JS_API_QUEUE_ITERATOR:
6114514f5e3Sopenharmony_ci                JSAPIQueueIterator::Cast(object)->VisitRangeSlot<visitType>(visitor);
6124514f5e3Sopenharmony_ci                break;
6134514f5e3Sopenharmony_ci            case JSType::JS_API_ARRAY_LIST:
6144514f5e3Sopenharmony_ci                JSAPIArrayList::Cast(object)->VisitRangeSlot<visitType>(visitor);
6154514f5e3Sopenharmony_ci                break;
6164514f5e3Sopenharmony_ci            case JSType::JS_API_ARRAYLIST_ITERATOR:
6174514f5e3Sopenharmony_ci                JSAPIArrayListIterator::Cast(object)->VisitRangeSlot<visitType>(visitor);
6184514f5e3Sopenharmony_ci                break;
6194514f5e3Sopenharmony_ci            case JSType::JS_API_LIGHT_WEIGHT_MAP:
6204514f5e3Sopenharmony_ci                JSAPILightWeightMap::Cast(object)->VisitRangeSlot<visitType>(visitor);
6214514f5e3Sopenharmony_ci                break;
6224514f5e3Sopenharmony_ci            case JSType::JS_API_LIGHT_WEIGHT_MAP_ITERATOR:
6234514f5e3Sopenharmony_ci                JSAPILightWeightMapIterator::Cast(object)->VisitRangeSlot<visitType>(visitor);
6244514f5e3Sopenharmony_ci                break;
6254514f5e3Sopenharmony_ci            case JSType::JS_API_LIGHT_WEIGHT_SET:
6264514f5e3Sopenharmony_ci                JSAPILightWeightSet::Cast(object)->VisitRangeSlot<visitType>(visitor);
6274514f5e3Sopenharmony_ci                break;
6284514f5e3Sopenharmony_ci            case JSType::JS_API_LIGHT_WEIGHT_SET_ITERATOR:
6294514f5e3Sopenharmony_ci                JSAPILightWeightSetIterator::Cast(object)->VisitRangeSlot<visitType>(visitor);
6304514f5e3Sopenharmony_ci                break;
6314514f5e3Sopenharmony_ci            case JSType::RB_TREENODE:
6324514f5e3Sopenharmony_ci                RBTreeNode::Cast(object)->VisitRangeSlot<visitType>(visitor);
6334514f5e3Sopenharmony_ci                break;
6344514f5e3Sopenharmony_ci            case JSType::LINKED_NODE:
6354514f5e3Sopenharmony_ci                LinkedNode::Cast(object)->VisitRangeSlot<visitType>(visitor);
6364514f5e3Sopenharmony_ci                break;
6374514f5e3Sopenharmony_ci            case JSType::JS_API_HASH_MAP:
6384514f5e3Sopenharmony_ci                JSAPIHashMap::Cast(object)->VisitRangeSlot<visitType>(visitor);
6394514f5e3Sopenharmony_ci                break;
6404514f5e3Sopenharmony_ci            case JSType::JS_API_HASH_SET:
6414514f5e3Sopenharmony_ci                JSAPIHashSet::Cast(object)->VisitRangeSlot<visitType>(visitor);
6424514f5e3Sopenharmony_ci                break;
6434514f5e3Sopenharmony_ci            case JSType::JS_API_HASHMAP_ITERATOR:
6444514f5e3Sopenharmony_ci                JSAPIHashMapIterator::Cast(object)->VisitRangeSlot<visitType>(visitor);
6454514f5e3Sopenharmony_ci                break;
6464514f5e3Sopenharmony_ci            case JSType::JS_API_HASHSET_ITERATOR:
6474514f5e3Sopenharmony_ci                JSAPIHashSetIterator::Cast(object)->VisitRangeSlot<visitType>(visitor);
6484514f5e3Sopenharmony_ci                break;
6494514f5e3Sopenharmony_ci            case JSType::JS_API_TREE_MAP:
6504514f5e3Sopenharmony_ci                JSAPITreeMap::Cast(object)->VisitRangeSlot<visitType>(visitor);
6514514f5e3Sopenharmony_ci                break;
6524514f5e3Sopenharmony_ci            case JSType::JS_API_TREE_SET:
6534514f5e3Sopenharmony_ci                JSAPITreeSet::Cast(object)->VisitRangeSlot<visitType>(visitor);
6544514f5e3Sopenharmony_ci                break;
6554514f5e3Sopenharmony_ci            case JSType::JS_API_TREEMAP_ITERATOR:
6564514f5e3Sopenharmony_ci                JSAPITreeMapIterator::Cast(object)->VisitRangeSlot<visitType>(visitor);
6574514f5e3Sopenharmony_ci                break;
6584514f5e3Sopenharmony_ci            case JSType::JS_API_TREESET_ITERATOR:
6594514f5e3Sopenharmony_ci                JSAPITreeSetIterator::Cast(object)->VisitRangeSlot<visitType>(visitor);
6604514f5e3Sopenharmony_ci                break;
6614514f5e3Sopenharmony_ci            case JSType::JS_API_PLAIN_ARRAY:
6624514f5e3Sopenharmony_ci                JSAPIPlainArray::Cast(object)->VisitRangeSlot<visitType>(visitor);
6634514f5e3Sopenharmony_ci                break;
6644514f5e3Sopenharmony_ci            case JSType::JS_API_PLAIN_ARRAY_ITERATOR:
6654514f5e3Sopenharmony_ci                JSAPIPlainArrayIterator::Cast(object)->VisitRangeSlot<visitType>(visitor);
6664514f5e3Sopenharmony_ci                break;
6674514f5e3Sopenharmony_ci            case JSType::JS_API_DEQUE:
6684514f5e3Sopenharmony_ci                JSAPIDeque::Cast(object)->VisitRangeSlot<visitType>(visitor);
6694514f5e3Sopenharmony_ci                break;
6704514f5e3Sopenharmony_ci            case JSType::JS_API_DEQUE_ITERATOR:
6714514f5e3Sopenharmony_ci                JSAPIDequeIterator::Cast(object)->VisitRangeSlot<visitType>(visitor);
6724514f5e3Sopenharmony_ci                break;
6734514f5e3Sopenharmony_ci            case JSType::JS_API_STACK:
6744514f5e3Sopenharmony_ci                JSAPIStack::Cast(object)->VisitRangeSlot<visitType>(visitor);
6754514f5e3Sopenharmony_ci                break;
6764514f5e3Sopenharmony_ci            case JSType::JS_API_STACK_ITERATOR:
6774514f5e3Sopenharmony_ci                JSAPIStackIterator::Cast(object)->VisitRangeSlot<visitType>(visitor);
6784514f5e3Sopenharmony_ci                break;
6794514f5e3Sopenharmony_ci            case JSType::JS_API_VECTOR:
6804514f5e3Sopenharmony_ci                JSAPIVector::Cast(object)->VisitRangeSlot<visitType>(visitor);
6814514f5e3Sopenharmony_ci                break;
6824514f5e3Sopenharmony_ci            case JSType::JS_API_BITVECTOR:
6834514f5e3Sopenharmony_ci                JSAPIBitVector::Cast(object)->VisitRangeSlot<visitType>(visitor);
6844514f5e3Sopenharmony_ci                break;
6854514f5e3Sopenharmony_ci            case JSType::JS_API_VECTOR_ITERATOR:
6864514f5e3Sopenharmony_ci                JSAPIVectorIterator::Cast(object)->VisitRangeSlot<visitType>(visitor);
6874514f5e3Sopenharmony_ci                break;
6884514f5e3Sopenharmony_ci            case JSType::JS_API_BITVECTOR_ITERATOR:
6894514f5e3Sopenharmony_ci                JSAPIBitVectorIterator::Cast(object)->VisitRangeSlot<visitType>(visitor);
6904514f5e3Sopenharmony_ci                break;
6914514f5e3Sopenharmony_ci            case JSType::JS_API_LIST:
6924514f5e3Sopenharmony_ci                JSAPIList::Cast(object)->VisitRangeSlot<visitType>(visitor);
6934514f5e3Sopenharmony_ci                break;
6944514f5e3Sopenharmony_ci            case JSType::JS_API_LINKED_LIST:
6954514f5e3Sopenharmony_ci                JSAPILinkedList::Cast(object)->VisitRangeSlot<visitType>(visitor);
6964514f5e3Sopenharmony_ci                break;
6974514f5e3Sopenharmony_ci            case JSType::JS_API_LIST_ITERATOR:
6984514f5e3Sopenharmony_ci                JSAPIListIterator::Cast(object)->VisitRangeSlot<visitType>(visitor);
6994514f5e3Sopenharmony_ci                break;
7004514f5e3Sopenharmony_ci            case JSType::JS_API_LINKED_LIST_ITERATOR:
7014514f5e3Sopenharmony_ci                JSAPILinkedListIterator::Cast(object)->VisitRangeSlot<visitType>(visitor);
7024514f5e3Sopenharmony_ci                break;
7034514f5e3Sopenharmony_ci            case JSType::BIGINT:
7044514f5e3Sopenharmony_ci                if constexpr (visitType == VisitType::ALL_VISIT) {
7054514f5e3Sopenharmony_ci                    BigInt::Cast(object)->VisitRangeSlot<visitType>(visitor);
7064514f5e3Sopenharmony_ci                }
7074514f5e3Sopenharmony_ci                break;
7084514f5e3Sopenharmony_ci            case JSType::SOURCE_TEXT_MODULE_RECORD:
7094514f5e3Sopenharmony_ci                SourceTextModule::Cast(object)->VisitRangeSlot<visitType>(visitor);
7104514f5e3Sopenharmony_ci                break;
7114514f5e3Sopenharmony_ci            case JSType::IMPORTENTRY_RECORD:
7124514f5e3Sopenharmony_ci                ImportEntry::Cast(object)->VisitRangeSlot<visitType>(visitor);
7134514f5e3Sopenharmony_ci                break;
7144514f5e3Sopenharmony_ci            case JSType::LOCAL_EXPORTENTRY_RECORD:
7154514f5e3Sopenharmony_ci                LocalExportEntry::Cast(object)->VisitRangeSlot<visitType>(visitor);
7164514f5e3Sopenharmony_ci                break;
7174514f5e3Sopenharmony_ci            case JSType::INDIRECT_EXPORTENTRY_RECORD:
7184514f5e3Sopenharmony_ci                IndirectExportEntry::Cast(object)->VisitRangeSlot<visitType>(visitor);
7194514f5e3Sopenharmony_ci                break;
7204514f5e3Sopenharmony_ci            case JSType::STAR_EXPORTENTRY_RECORD:
7214514f5e3Sopenharmony_ci                StarExportEntry::Cast(object)->VisitRangeSlot<visitType>(visitor);
7224514f5e3Sopenharmony_ci                break;
7234514f5e3Sopenharmony_ci            case JSType::RESOLVEDBINDING_RECORD:
7244514f5e3Sopenharmony_ci                ResolvedBinding::Cast(object)->VisitRangeSlot<visitType>(visitor);
7254514f5e3Sopenharmony_ci                break;
7264514f5e3Sopenharmony_ci            case JSType::RESOLVEDINDEXBINDING_RECORD:
7274514f5e3Sopenharmony_ci                ResolvedIndexBinding::Cast(object)->VisitRangeSlot<visitType>(visitor);
7284514f5e3Sopenharmony_ci                break;
7294514f5e3Sopenharmony_ci            case JSType::RESOLVEDRECORDINDEXBINDING_RECORD:
7304514f5e3Sopenharmony_ci                ResolvedRecordIndexBinding::Cast(object)->VisitRangeSlot<visitType>(visitor);
7314514f5e3Sopenharmony_ci                break;
7324514f5e3Sopenharmony_ci            case JSType::RESOLVEDRECORDBINDING_RECORD:
7334514f5e3Sopenharmony_ci                ResolvedRecordBinding::Cast(object)->VisitRangeSlot<visitType>(visitor);
7344514f5e3Sopenharmony_ci                break;
7354514f5e3Sopenharmony_ci            case JSType::JS_MODULE_NAMESPACE:
7364514f5e3Sopenharmony_ci                ModuleNamespace::Cast(object)->VisitRangeSlot<visitType>(visitor);
7374514f5e3Sopenharmony_ci                break;
7384514f5e3Sopenharmony_ci            case JSType::JS_CJS_EXPORTS:
7394514f5e3Sopenharmony_ci                CjsExports::Cast(object)->VisitRangeSlot<visitType>(visitor);
7404514f5e3Sopenharmony_ci                break;
7414514f5e3Sopenharmony_ci            case JSType::JS_CJS_MODULE:
7424514f5e3Sopenharmony_ci                CjsModule::Cast(object)->VisitRangeSlot<visitType>(visitor);
7434514f5e3Sopenharmony_ci                break;
7444514f5e3Sopenharmony_ci            case JSType::JS_CJS_REQUIRE:
7454514f5e3Sopenharmony_ci                CjsRequire::Cast(object)->VisitRangeSlot<visitType>(visitor);
7464514f5e3Sopenharmony_ci                break;
7474514f5e3Sopenharmony_ci            case JSType::METHOD:
7484514f5e3Sopenharmony_ci                Method::Cast(object)->VisitRangeSlot<visitType>(visitor);
7494514f5e3Sopenharmony_ci                break;
7504514f5e3Sopenharmony_ci            case JSType::CLASS_LITERAL:
7514514f5e3Sopenharmony_ci                ClassLiteral::Cast(object)->VisitRangeSlot<visitType>(visitor);
7524514f5e3Sopenharmony_ci                break;
7534514f5e3Sopenharmony_ci            case JSType::NATIVE_MODULE_FAILURE_INFO:
7544514f5e3Sopenharmony_ci                NativeModuleFailureInfo::Cast(object)->VisitRangeSlot<visitType>(visitor);
7554514f5e3Sopenharmony_ci                break;
7564514f5e3Sopenharmony_ci            default:
7574514f5e3Sopenharmony_ci                LOG_ECMA(FATAL) << "this branch is unreachable, type: " << static_cast<size_t>(type);
7584514f5e3Sopenharmony_ci                UNREACHABLE();
7594514f5e3Sopenharmony_ci        }
7604514f5e3Sopenharmony_ci    }
7614514f5e3Sopenharmony_ci};
7624514f5e3Sopenharmony_ci}  // namespace panda::ecmascript
7634514f5e3Sopenharmony_ci
7644514f5e3Sopenharmony_ci#endif  // ECMASCRIPT_MEM_OBJECT_XRAY_H
765