[heap] Allow shared objects in global/traced handles

Global/traced handles are only ever used with two callbacks:
 * MarkCompactCollector::IsUnmarkedHeapObject
 * IsUnscavengedHeapObjectSlot

IsUnscavengedHeapObjectSlot already works with shared heap objects
because it only applies to objects in the young generation.

This CL fixes MarkCompactCollector::IsUnmarkedHeapObject with shared
heap objects. E.g. a local GC isn't allowed to load markbits for
shared objects.

Bug: v8:13267
Change-Id: Id0fb9ed73409e384eed4c7168100a1bf40a06f94
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/4044362
Reviewed-by: Michael Lippautz <mlippautz@chromium.org>
Commit-Queue: Dominik Inführ <dinfuehr@chromium.org>
Cr-Commit-Position: refs/heads/main@{#84414}
This commit is contained in:
Dominik Inführ 2022-11-21 21:42:20 +01:00 committed by V8 LUCI CQ
parent 00c7e383a8
commit f76262d87a
2 changed files with 32 additions and 2 deletions

View File

@ -2008,12 +2008,17 @@ class EvacuateRecordOnlyVisitor final : public HeapObjectVisitor {
#endif // V8_COMPRESS_POINTERS
};
// static
bool MarkCompactCollector::IsUnmarkedHeapObject(Heap* heap, FullObjectSlot p) {
Object o = *p;
if (!o.IsHeapObject()) return false;
HeapObject heap_object = HeapObject::cast(o);
return heap->mark_compact_collector()->non_atomic_marking_state()->IsWhite(
heap_object);
MarkCompactCollector* collector = heap->mark_compact_collector();
if (V8_UNLIKELY(collector->uses_shared_heap_) &&
!collector->is_shared_heap_isolate_) {
if (heap_object.InSharedWritableHeap()) return false;
}
return collector->non_atomic_marking_state()->IsWhite(heap_object);
}
void MarkCompactCollector::MarkRoots(RootVisitor* root_visitor,

View File

@ -1778,6 +1778,31 @@ UNINITIALIZED_TEST(ConcurrentExternalizationAndInternalizationHit) {
TestConcurrentExternalizationAndInternalization(kTestHit);
}
UNINITIALIZED_TEST(SharedStringInGlobalHandle) {
if (!V8_CAN_CREATE_SHARED_HEAP_BOOL) return;
v8_flags.shared_string_table = true;
ExternalResourceFactory resource_factory;
MultiClientIsolateTest test;
Isolate* i_isolate = test.i_main_isolate();
Factory* factory = i_isolate->factory();
HandleScope handle_scope(i_isolate);
Handle<String> shared_string =
factory->NewStringFromAsciiChecked("foobar", AllocationType::kSharedOld);
CHECK(shared_string->InSharedWritableHeap());
v8::Local<v8::String> lh_shared_string =
Utils::Convert<String, v8::String>(shared_string);
v8::Global<v8::String> gh_shared_string(test.main_isolate(),
lh_shared_string);
gh_shared_string.SetWeak();
CcTest::CollectGarbage(OLD_SPACE, i_isolate);
CHECK(!gh_shared_string.IsEmpty());
}
} // namespace test_shared_strings
} // namespace internal
} // namespace v8