[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:
parent
00c7e383a8
commit
f76262d87a
@ -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,
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user