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