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