@@ -2935,53 +2935,95 @@ void IsolateGroup::VisitObjectPointers(ObjectPointerVisitor* visitor,
29352935 VisitStackPointers (visitor, validate_frames);
29362936}
29372937
2938- void IsolateGroup::VisitSharedPointers (ObjectPointerVisitor* visitor) {
2939- // Visit objects in the class table.
2940- class_table ()->VisitObjectPointers (visitor);
2941- if (heap_walk_class_table () != class_table ()) {
2942- heap_walk_class_table ()->VisitObjectPointers (visitor);
2943- }
2944- api_state ()->VisitObjectPointersUnlocked (visitor);
2945- // Visit objects in the object store.
2946- if (object_store () != nullptr ) {
2947- object_store ()->VisitObjectPointers (visitor);
2948- }
2949- visitor->VisitPointer (reinterpret_cast <ObjectPtr*>(&saved_unlinked_calls_));
2950- initial_field_table ()->VisitObjectPointers (visitor);
2951- sentinel_field_table ()->VisitObjectPointers (visitor);
2952- shared_initial_field_table ()->VisitObjectPointers (visitor);
2953- shared_field_table ()->VisitObjectPointers (visitor);
2954-
2955- // Visit the boxed_field_list_.
2956- // 'boxed_field_list_' access via mutator and background compilation threads
2957- // is guarded with a monitor. This means that we can visit it only
2958- // when at safepoint or the field_list_mutex_ lock has been taken.
2959- visitor->VisitPointer (reinterpret_cast <ObjectPtr*>(&boxed_field_list_));
2960-
2961- NOT_IN_PRECOMPILED (background_compiler ()->VisitPointers (visitor));
2962-
2938+ void IsolateGroup::VisitSharedPointers (ObjectPointerVisitor* visitor,
2939+ intptr_t slice) {
2940+ switch (slice) {
2941+ case kClassTable :
2942+ class_table ()->VisitObjectPointers (visitor);
2943+ if (heap_walk_class_table () != class_table ()) {
2944+ heap_walk_class_table ()->VisitObjectPointers (visitor);
2945+ }
2946+ break ;
2947+ case kApiState :
2948+ api_state ()->VisitObjectPointersUnlocked (visitor);
2949+ break ;
2950+ case kObjectStore :
2951+ if (object_store () != nullptr ) {
2952+ object_store ()->VisitObjectPointers (visitor);
2953+ }
2954+ break ;
2955+ case kSavedUnlinkedCalls :
2956+ visitor->VisitPointer (
2957+ reinterpret_cast <ObjectPtr*>(&saved_unlinked_calls_));
2958+ break ;
2959+ case kInitialFieldTable :
2960+ initial_field_table ()->VisitObjectPointers (visitor);
2961+ break ;
2962+ case kSentinelFieldTable :
2963+ sentinel_field_table ()->VisitObjectPointers (visitor);
2964+ break ;
2965+ case kSharedInitialFieldTable :
2966+ shared_initial_field_table ()->VisitObjectPointers (visitor);
2967+ break ;
2968+ case kSharedFieldTable :
2969+ shared_field_table ()->VisitObjectPointers (visitor);
2970+ break ;
2971+ case kBoxedFieldList :
2972+ // Visit the boxed_field_list_.
2973+ // 'boxed_field_list_' access via mutator and background compilation
2974+ // threads is guarded with a monitor. This means that we can visit it only
2975+ // when at safepoint or the field_list_mutex_ lock has been taken.
2976+ visitor->VisitPointer (reinterpret_cast <ObjectPtr*>(&boxed_field_list_));
2977+ break ;
2978+ case kBackgroundCompiler :
2979+ NOT_IN_PRECOMPILED (background_compiler ()->VisitPointers (visitor));
2980+ break ;
2981+ case kDebugger :
29632982#if !defined(PRODUCT)
2964- if (debugger () != nullptr ) {
2965- debugger ()->VisitObjectPointers (visitor);
2966- }
2983+ if (debugger () != nullptr ) {
2984+ debugger ()->VisitObjectPointers (visitor);
2985+ }
29672986#endif
2968-
2987+ break ;
2988+ case kReloadContext :
29692989#if !defined(PRODUCT) && !defined(DART_PRECOMPILED_RUNTIME)
2970- // Visit objects that are being used for isolate reload.
2971- if (program_reload_context () != nullptr ) {
2972- program_reload_context ()->VisitObjectPointers (visitor);
2973- program_reload_context ()->group_reload_context ()->VisitObjectPointers (
2974- visitor);
2975- }
2990+ if (program_reload_context () != nullptr ) {
2991+ program_reload_context ()->VisitObjectPointers (visitor);
2992+ program_reload_context ()->group_reload_context ()->VisitObjectPointers (
2993+ visitor);
2994+ }
29762995#endif // !defined(PRODUCT) && !defined(DART_PRECOMPILED_RUNTIME)
2977-
2978- if (source ()->loaded_blobs_ != nullptr ) {
2979- visitor->VisitPointer (
2980- reinterpret_cast <ObjectPtr*>(&(source ()->loaded_blobs_ )));
2996+ break ;
2997+ case kLoadedBlobs :
2998+ if (source ()->loaded_blobs_ != nullptr ) {
2999+ visitor->VisitPointer (
3000+ reinterpret_cast <ObjectPtr*>(&(source ()->loaded_blobs_ )));
3001+ }
3002+ break ;
3003+ case kBecome :
3004+ if (become () != nullptr ) {
3005+ become ()->VisitObjectPointers (visitor);
3006+ }
3007+ break ;
3008+ case kObjectIdZones :
3009+ #if !defined(PRODUCT)
3010+ if (visitor->trace_object_id_rings ()) {
3011+ for (Isolate* isolate : isolates_) {
3012+ for (intptr_t i = 0 ; i < isolate->NumServiceIdZones (); ++i) {
3013+ isolate->GetServiceIdZone (i)->VisitPointers (visitor);
3014+ }
3015+ }
3016+ }
3017+ #endif // !defined(PRODUCT)
3018+ break ;
3019+ default :
3020+ UNREACHABLE ();
29813021 }
3022+ }
29823023
2983- if (become () != nullptr ) {
2984- become ()->VisitObjectPointers (visitor);
3024+ void IsolateGroup::VisitSharedPointers (ObjectPointerVisitor* visitor) {
3025+ for (intptr_t i = 0 ; i < kNumRootSlices ; i++) {
3026+ VisitSharedPointers (visitor, static_cast <RootSlice>(i));
29853027 }
29863028}
29873029
@@ -3002,17 +3044,6 @@ void IsolateGroup::VisitStackPointers(ObjectPointerVisitor* visitor,
30023044 visitor->clear_gc_root_type ();
30033045}
30043046
3005- void IsolateGroup::VisitPointersInAllServiceIdZones (
3006- ObjectPointerVisitor& visitor) {
3007- #if !defined(PRODUCT)
3008- for (Isolate* isolate : isolates_) {
3009- for (intptr_t i = 0 ; i < isolate->NumServiceIdZones (); ++i) {
3010- isolate->GetServiceIdZone (i)->VisitPointers (visitor);
3011- }
3012- }
3013- #endif // !defined(PRODUCT)
3014- }
3015-
30163047void IsolateGroup::VisitWeakPersistentHandles (HandleVisitor* visitor) {
30173048 api_state ()->VisitWeakHandlesUnlocked (visitor);
30183049}
0 commit comments