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