[vm/reload] Fix how isolate group source loaded_blobs are visited.

loaded_blobs need to be visited as part of IsolateGroup::Visit method rather than Isolate::Visit one.
Before this change loaded_blobs could become corrupted because GC requires objects being visited only once during collection cycles.

Fixes https://github.com/flutter/flutter/issues/89406

TEST=ci, flutter

Change-Id: Ic61498c205c5cc072e5f45928264a507a7752e0d
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/212440
Commit-Queue: Alexander Aprelev <aam@google.com>
Reviewed-by: Martin Kustermann <kustermann@google.com>
This commit is contained in:
Alexander Aprelev 2021-09-03 15:30:09 +00:00 committed by commit-bot@chromium.org
parent 29ba68fcf2
commit 5ccf97a5a9

View file

@ -2681,12 +2681,6 @@ void Isolate::VisitObjectPointers(ObjectPointerVisitor* visitor,
visitor->VisitPointer(reinterpret_cast<ObjectPtr*>(&ic_miss_code_));
visitor->VisitPointer(reinterpret_cast<ObjectPtr*>(&tag_table_));
visitor->VisitPointer(reinterpret_cast<ObjectPtr*>(&sticky_error_));
if (isolate_group_ != nullptr) {
if (isolate_group_->source()->loaded_blobs_ != nullptr) {
visitor->VisitPointer(reinterpret_cast<ObjectPtr*>(
&(isolate_group_->source()->loaded_blobs_)));
}
}
#if !defined(PRODUCT)
visitor->VisitPointer(
reinterpret_cast<ObjectPtr*>(&pending_service_extension_calls_));
@ -2889,6 +2883,11 @@ void IsolateGroup::VisitSharedPointers(ObjectPointerVisitor* visitor) {
visitor);
}
#endif // !defined(PRODUCT) && !defined(DART_PRECOMPILED_RUNTIME)
if (source()->loaded_blobs_ != nullptr) {
visitor->VisitPointer(
reinterpret_cast<ObjectPtr*>(&(source()->loaded_blobs_)));
}
}
void IsolateGroup::VisitStackPointers(ObjectPointerVisitor* visitor,