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