Commit f300a01a authored by Michael Lippautz's avatar Michael Lippautz Committed by V8 LUCI CQ

unittests: Provide Context in TestWithHeapInternals

Change-Id: I54e658325dfbfb425c41cab2fd7b32253b380e37
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3247038
Commit-Queue: Michael Lippautz <mlippautz@chromium.org>
Commit-Queue: Omer Katz <omerkatz@chromium.org>
Auto-Submit: Michael Lippautz <mlippautz@chromium.org>
Reviewed-by: 's avatarOmer Katz <omerkatz@chromium.org>
Cr-Commit-Position: refs/heads/main@{#77577}
parent 99284e34
...@@ -37,12 +37,13 @@ class WithHeapInternals : public TMixin, HeapInternalsBase { ...@@ -37,12 +37,13 @@ class WithHeapInternals : public TMixin, HeapInternalsBase {
} }
}; };
using TestWithHeapInternals = // using TestWithHeapInternals = //
WithHeapInternals< // WithHeapInternals< //
WithInternalIsolateMixin< // WithContextMixin< //
WithIsolateScopeMixin< // WithInternalIsolateMixin< //
WithIsolateMixin< // WithIsolateScopeMixin< //
::testing::Test>>>>; WithIsolateMixin< //
::testing::Test>>>>>;
} // namespace internal } // namespace internal
} // namespace v8 } // namespace v8
......
...@@ -10,155 +10,119 @@ ...@@ -10,155 +10,119 @@
namespace v8 { namespace v8 {
namespace internal { namespace internal {
using TracedReferenceTest = TestWithIsolate; using TracedReferenceTest = TestWithContext;
TEST_F(TracedReferenceTest, ResetFromLocal) { TEST_F(TracedReferenceTest, ResetFromLocal) {
v8::Local<v8::Context> context = v8::Context::New(v8_isolate());
v8::Context::Scope context_scope(context);
v8::TracedReference<v8::Object> ref; v8::TracedReference<v8::Object> ref;
{ v8::HandleScope handles(v8_isolate());
v8::HandleScope handles(v8_isolate()); v8::Local<v8::Object> local =
v8::Local<v8::Object> local = v8::Local<v8::Object>::New(v8_isolate(), v8::Object::New(v8_isolate()));
v8::Local<v8::Object>::New(v8_isolate(), v8::Object::New(v8_isolate())); EXPECT_TRUE(ref.IsEmpty());
EXPECT_TRUE(ref.IsEmpty()); EXPECT_NE(ref, local);
EXPECT_NE(ref, local); ref.Reset(v8_isolate(), local);
ref.Reset(v8_isolate(), local); EXPECT_FALSE(ref.IsEmpty());
EXPECT_FALSE(ref.IsEmpty()); EXPECT_EQ(ref, local);
EXPECT_EQ(ref, local);
}
} }
TEST_F(TracedReferenceTest, ConstructFromLocal) { TEST_F(TracedReferenceTest, ConstructFromLocal) {
v8::Local<v8::Context> context = v8::Context::New(v8_isolate()); v8::HandleScope handles(v8_isolate());
v8::Context::Scope context_scope(context); v8::Local<v8::Object> local =
{ v8::Local<v8::Object>::New(v8_isolate(), v8::Object::New(v8_isolate()));
v8::HandleScope handles(v8_isolate()); v8::TracedReference<v8::Object> ref(v8_isolate(), local);
v8::Local<v8::Object> local = EXPECT_FALSE(ref.IsEmpty());
v8::Local<v8::Object>::New(v8_isolate(), v8::Object::New(v8_isolate())); EXPECT_EQ(ref, local);
v8::TracedReference<v8::Object> ref(v8_isolate(), local);
EXPECT_FALSE(ref.IsEmpty());
EXPECT_EQ(ref, local);
}
} }
TEST_F(TracedReferenceTest, Reset) { TEST_F(TracedReferenceTest, Reset) {
v8::Local<v8::Context> context = v8::Context::New(v8_isolate()); v8::HandleScope handles(v8_isolate());
v8::Context::Scope context_scope(context); v8::Local<v8::Object> local =
{ v8::Local<v8::Object>::New(v8_isolate(), v8::Object::New(v8_isolate()));
v8::HandleScope handles(v8_isolate()); v8::TracedReference<v8::Object> ref(v8_isolate(), local);
v8::Local<v8::Object> local = EXPECT_FALSE(ref.IsEmpty());
v8::Local<v8::Object>::New(v8_isolate(), v8::Object::New(v8_isolate())); EXPECT_EQ(ref, local);
v8::TracedReference<v8::Object> ref(v8_isolate(), local); ref.Reset();
EXPECT_FALSE(ref.IsEmpty()); EXPECT_TRUE(ref.IsEmpty());
EXPECT_EQ(ref, local); EXPECT_NE(ref, local);
ref.Reset();
EXPECT_TRUE(ref.IsEmpty());
EXPECT_NE(ref, local);
}
} }
TEST_F(TracedReferenceTest, Copy) { TEST_F(TracedReferenceTest, Copy) {
v8::Local<v8::Context> context = v8::Context::New(v8_isolate()); v8::HandleScope handles(v8_isolate());
v8::Context::Scope context_scope(context); v8::Local<v8::Object> local =
{ v8::Local<v8::Object>::New(v8_isolate(), v8::Object::New(v8_isolate()));
v8::HandleScope handles(v8_isolate()); v8::TracedReference<v8::Object> ref(v8_isolate(), local);
v8::Local<v8::Object> local = v8::TracedReference<v8::Object> ref_copy1(ref);
v8::Local<v8::Object>::New(v8_isolate(), v8::Object::New(v8_isolate())); v8::TracedReference<v8::Object> ref_copy2 = ref;
v8::TracedReference<v8::Object> ref(v8_isolate(), local); EXPECT_EQ(ref, local);
v8::TracedReference<v8::Object> ref_copy1(ref); EXPECT_EQ(ref_copy1, local);
v8::TracedReference<v8::Object> ref_copy2 = ref; EXPECT_EQ(ref_copy2, local);
EXPECT_EQ(ref, local);
EXPECT_EQ(ref_copy1, local);
EXPECT_EQ(ref_copy2, local);
}
} }
TEST_F(TracedReferenceTest, CopyHeterogenous) { TEST_F(TracedReferenceTest, CopyHeterogenous) {
v8::Local<v8::Context> context = v8::Context::New(v8_isolate()); v8::HandleScope handles(v8_isolate());
v8::Context::Scope context_scope(context); v8::Local<v8::Object> local =
{ v8::Local<v8::Object>::New(v8_isolate(), v8::Object::New(v8_isolate()));
v8::HandleScope handles(v8_isolate()); v8::TracedReference<v8::Object> ref(v8_isolate(), local);
v8::Local<v8::Object> local = v8::TracedReference<v8::Value> ref_copy1(ref);
v8::Local<v8::Object>::New(v8_isolate(), v8::Object::New(v8_isolate())); v8::TracedReference<v8::Value> ref_copy2 = ref;
v8::TracedReference<v8::Object> ref(v8_isolate(), local); EXPECT_EQ(ref, local);
v8::TracedReference<v8::Value> ref_copy1(ref); EXPECT_EQ(ref_copy1, local);
v8::TracedReference<v8::Value> ref_copy2 = ref; EXPECT_EQ(ref_copy2, local);
EXPECT_EQ(ref, local);
EXPECT_EQ(ref_copy1, local);
EXPECT_EQ(ref_copy2, local);
}
} }
TEST_F(TracedReferenceTest, Move) { TEST_F(TracedReferenceTest, Move) {
v8::Local<v8::Context> context = v8::Context::New(v8_isolate()); v8::HandleScope handles(v8_isolate());
v8::Context::Scope context_scope(context); v8::Local<v8::Object> local =
{ v8::Local<v8::Object>::New(v8_isolate(), v8::Object::New(v8_isolate()));
v8::HandleScope handles(v8_isolate()); v8::TracedReference<v8::Object> ref(v8_isolate(), local);
v8::Local<v8::Object> local = v8::TracedReference<v8::Object> ref_moved1(std::move(ref));
v8::Local<v8::Object>::New(v8_isolate(), v8::Object::New(v8_isolate())); v8::TracedReference<v8::Object> ref_moved2 = std::move(ref_moved1);
v8::TracedReference<v8::Object> ref(v8_isolate(), local); EXPECT_TRUE(ref.IsEmpty());
v8::TracedReference<v8::Object> ref_moved1(std::move(ref)); EXPECT_TRUE(ref_moved1.IsEmpty());
v8::TracedReference<v8::Object> ref_moved2 = std::move(ref_moved1); EXPECT_EQ(ref_moved2, local);
EXPECT_TRUE(ref.IsEmpty());
EXPECT_TRUE(ref_moved1.IsEmpty());
EXPECT_EQ(ref_moved2, local);
}
} }
TEST_F(TracedReferenceTest, MoveHeterogenous) { TEST_F(TracedReferenceTest, MoveHeterogenous) {
v8::Local<v8::Context> context = v8::Context::New(v8_isolate()); v8::HandleScope handles(v8_isolate());
v8::Context::Scope context_scope(context); v8::Local<v8::Object> local =
{ v8::Local<v8::Object>::New(v8_isolate(), v8::Object::New(v8_isolate()));
v8::HandleScope handles(v8_isolate()); v8::TracedReference<v8::Object> ref1(v8_isolate(), local);
v8::Local<v8::Object> local = v8::TracedReference<v8::Value> ref_moved1(std::move(ref1));
v8::Local<v8::Object>::New(v8_isolate(), v8::Object::New(v8_isolate())); v8::TracedReference<v8::Object> ref2(v8_isolate(), local);
v8::TracedReference<v8::Object> ref1(v8_isolate(), local); v8::TracedReference<v8::Object> ref_moved2 = std::move(ref2);
v8::TracedReference<v8::Value> ref_moved1(std::move(ref1)); EXPECT_TRUE(ref1.IsEmpty());
v8::TracedReference<v8::Object> ref2(v8_isolate(), local); EXPECT_EQ(ref_moved1, local);
v8::TracedReference<v8::Object> ref_moved2 = std::move(ref2); EXPECT_TRUE(ref2.IsEmpty());
EXPECT_TRUE(ref1.IsEmpty()); EXPECT_EQ(ref_moved2, local);
EXPECT_EQ(ref_moved1, local);
EXPECT_TRUE(ref2.IsEmpty());
EXPECT_EQ(ref_moved2, local);
}
} }
TEST_F(TracedReferenceTest, Equality) { TEST_F(TracedReferenceTest, Equality) {
v8::Local<v8::Context> context = v8::Context::New(v8_isolate()); v8::HandleScope handles(v8_isolate());
v8::Context::Scope context_scope(context); v8::Local<v8::Object> local1 =
{ v8::Local<v8::Object>::New(v8_isolate(), v8::Object::New(v8_isolate()));
v8::HandleScope handles(v8_isolate()); v8::TracedReference<v8::Object> ref1(v8_isolate(), local1);
v8::Local<v8::Object> local1 = v8::TracedReference<v8::Object> ref2(v8_isolate(), local1);
v8::Local<v8::Object>::New(v8_isolate(), v8::Object::New(v8_isolate())); EXPECT_EQ(ref1, ref2);
v8::TracedReference<v8::Object> ref1(v8_isolate(), local1); EXPECT_EQ(ref2, ref1);
v8::TracedReference<v8::Object> ref2(v8_isolate(), local1); v8::Local<v8::Object> local2 =
EXPECT_EQ(ref1, ref2); v8::Local<v8::Object>::New(v8_isolate(), v8::Object::New(v8_isolate()));
EXPECT_EQ(ref2, ref1); v8::TracedReference<v8::Object> ref3(v8_isolate(), local2);
v8::Local<v8::Object> local2 = EXPECT_NE(ref2, ref3);
v8::Local<v8::Object>::New(v8_isolate(), v8::Object::New(v8_isolate())); EXPECT_NE(ref3, ref2);
v8::TracedReference<v8::Object> ref3(v8_isolate(), local2);
EXPECT_NE(ref2, ref3);
EXPECT_NE(ref3, ref2);
}
} }
TEST_F(TracedReferenceTest, EqualityHeterogenous) { TEST_F(TracedReferenceTest, EqualityHeterogenous) {
v8::Local<v8::Context> context = v8::Context::New(v8_isolate()); v8::HandleScope handles(v8_isolate());
v8::Context::Scope context_scope(context); v8::Local<v8::Object> local1 =
{ v8::Local<v8::Object>::New(v8_isolate(), v8::Object::New(v8_isolate()));
v8::HandleScope handles(v8_isolate()); v8::TracedReference<v8::Object> ref1(v8_isolate(), local1);
v8::Local<v8::Object> local1 = v8::TracedReference<v8::Value> ref2(v8_isolate(), local1);
v8::Local<v8::Object>::New(v8_isolate(), v8::Object::New(v8_isolate())); EXPECT_EQ(ref1, ref2);
v8::TracedReference<v8::Object> ref1(v8_isolate(), local1); EXPECT_EQ(ref2, ref1);
v8::TracedReference<v8::Value> ref2(v8_isolate(), local1); v8::Local<v8::Object> local2 =
EXPECT_EQ(ref1, ref2); v8::Local<v8::Object>::New(v8_isolate(), v8::Object::New(v8_isolate()));
EXPECT_EQ(ref2, ref1); v8::TracedReference<v8::Object> ref3(v8_isolate(), local2);
v8::Local<v8::Object> local2 = EXPECT_NE(ref2, ref3);
v8::Local<v8::Object>::New(v8_isolate(), v8::Object::New(v8_isolate())); EXPECT_NE(ref3, ref2);
v8::TracedReference<v8::Object> ref3(v8_isolate(), local2);
EXPECT_NE(ref2, ref3);
EXPECT_NE(ref3, ref2);
}
} }
namespace { namespace {
...@@ -185,19 +149,15 @@ class JSVisitorForTesting final : public JSVisitor { ...@@ -185,19 +149,15 @@ class JSVisitorForTesting final : public JSVisitor {
} // namespace } // namespace
TEST_F(TracedReferenceTest, TracedReferenceTrace) { TEST_F(TracedReferenceTest, TracedReferenceTrace) {
v8::Local<v8::Context> context = v8::Context::New(v8_isolate()); v8::HandleScope handles(v8_isolate());
v8::Context::Scope context_scope(context); v8::Local<v8::Object> local =
{ v8::Local<v8::Object>::New(v8_isolate(), v8::Object::New(v8_isolate()));
v8::HandleScope handles(v8_isolate()); v8::TracedReference<v8::Object> js_member(v8_isolate(), local);
v8::Local<v8::Object> local = JSVisitorForTesting visitor(local);
v8::Local<v8::Object>::New(v8_isolate(), v8::Object::New(v8_isolate())); // Cast to cppgc::Visitor to ensure that we dispatch through the base
v8::TracedReference<v8::Object> js_member(v8_isolate(), local); // visitor and use traits.
JSVisitorForTesting visitor(local); static_cast<cppgc::Visitor&>(visitor).Trace(js_member);
// Cast to cppgc::Visitor to ensure that we dispatch through the base EXPECT_EQ(1u, visitor.visit_count());
// visitor and use traits.
static_cast<cppgc::Visitor&>(visitor).Trace(js_member);
EXPECT_EQ(1u, visitor.visit_count());
}
} }
} // namespace internal } // namespace internal
......
...@@ -60,11 +60,9 @@ TEST_F(UnifiedHeapTest, OnlyGC) { CollectGarbageWithEmbedderStack(); } ...@@ -60,11 +60,9 @@ TEST_F(UnifiedHeapTest, OnlyGC) { CollectGarbageWithEmbedderStack(); }
TEST_F(UnifiedHeapTest, FindingV8ToBlinkReference) { TEST_F(UnifiedHeapTest, FindingV8ToBlinkReference) {
v8::HandleScope scope(v8_isolate()); v8::HandleScope scope(v8_isolate());
v8::Local<v8::Context> context = v8::Context::New(v8_isolate());
v8::Context::Scope context_scope(context);
uint16_t wrappable_type = WrapperHelper::kTracedEmbedderId; uint16_t wrappable_type = WrapperHelper::kTracedEmbedderId;
v8::Local<v8::Object> api_object = WrapperHelper::CreateWrapper( v8::Local<v8::Object> api_object = WrapperHelper::CreateWrapper(
context, &wrappable_type, context(), &wrappable_type,
cppgc::MakeGarbageCollected<Wrappable>(allocation_handle())); cppgc::MakeGarbageCollected<Wrappable>(allocation_handle()));
Wrappable::destructor_callcount = 0; Wrappable::destructor_callcount = 0;
EXPECT_FALSE(api_object.IsEmpty()); EXPECT_FALSE(api_object.IsEmpty());
...@@ -78,12 +76,11 @@ TEST_F(UnifiedHeapTest, FindingV8ToBlinkReference) { ...@@ -78,12 +76,11 @@ TEST_F(UnifiedHeapTest, FindingV8ToBlinkReference) {
TEST_F(UnifiedHeapTest, WriteBarrierV8ToCppReference) { TEST_F(UnifiedHeapTest, WriteBarrierV8ToCppReference) {
if (!FLAG_incremental_marking) return; if (!FLAG_incremental_marking) return;
v8::HandleScope scope(v8_isolate()); v8::HandleScope scope(v8_isolate());
v8::Local<v8::Context> context = v8::Context::New(v8_isolate());
v8::Context::Scope context_scope(context);
void* wrappable = cppgc::MakeGarbageCollected<Wrappable>(allocation_handle()); void* wrappable = cppgc::MakeGarbageCollected<Wrappable>(allocation_handle());
v8::Local<v8::Object> api_object = v8::Local<v8::Object> api_object =
WrapperHelper::CreateWrapper(context, nullptr, nullptr); WrapperHelper::CreateWrapper(context(), nullptr, nullptr);
Wrappable::destructor_callcount = 0; Wrappable::destructor_callcount = 0;
WrapperHelper::ResetWrappableConnection(api_object); WrapperHelper::ResetWrappableConnection(api_object);
SimulateIncrementalMarking(); SimulateIncrementalMarking();
...@@ -105,9 +102,8 @@ TEST_F(UnifiedHeapTest, WriteBarrierV8ToCppReference) { ...@@ -105,9 +102,8 @@ TEST_F(UnifiedHeapTest, WriteBarrierV8ToCppReference) {
TEST_F(UnifiedHeapTest, WriteBarrierCppToV8Reference) { TEST_F(UnifiedHeapTest, WriteBarrierCppToV8Reference) {
if (!FLAG_incremental_marking) return; if (!FLAG_incremental_marking) return;
v8::HandleScope scope(v8_isolate()); v8::HandleScope scope(v8_isolate());
v8::Local<v8::Context> context = v8::Context::New(v8_isolate());
v8::Context::Scope context_scope(context);
cppgc::Persistent<Wrappable> wrappable = cppgc::Persistent<Wrappable> wrappable =
cppgc::MakeGarbageCollected<Wrappable>(allocation_handle()); cppgc::MakeGarbageCollected<Wrappable>(allocation_handle());
Wrappable::destructor_callcount = 0; Wrappable::destructor_callcount = 0;
...@@ -119,7 +115,7 @@ TEST_F(UnifiedHeapTest, WriteBarrierCppToV8Reference) { ...@@ -119,7 +115,7 @@ TEST_F(UnifiedHeapTest, WriteBarrierCppToV8Reference) {
// setter for C++ to JS references. // setter for C++ to JS references.
v8::HandleScope nested_scope(v8_isolate()); v8::HandleScope nested_scope(v8_isolate());
v8::Local<v8::Object> api_object = v8::Local<v8::Object> api_object =
WrapperHelper::CreateWrapper(context, nullptr, nullptr); WrapperHelper::CreateWrapper(context(), nullptr, nullptr);
// Setting only one field to avoid treating this as wrappable backref, see // Setting only one field to avoid treating this as wrappable backref, see
// `LocalEmbedderHeapTracer::ExtractWrapperInfo`. // `LocalEmbedderHeapTracer::ExtractWrapperInfo`.
api_object->SetAlignedPointerInInternalField(1, kMagicAddress); api_object->SetAlignedPointerInInternalField(1, kMagicAddress);
...@@ -148,8 +144,6 @@ class Unreferenced : public cppgc::GarbageCollected<Unreferenced> { ...@@ -148,8 +144,6 @@ class Unreferenced : public cppgc::GarbageCollected<Unreferenced> {
TEST_F(UnifiedHeapTest, FreeUnreferencedDuringNoGcScope) { TEST_F(UnifiedHeapTest, FreeUnreferencedDuringNoGcScope) {
v8::HandleScope handle_scope(v8_isolate()); v8::HandleScope handle_scope(v8_isolate());
v8::Local<v8::Context> context = v8::Context::New(v8_isolate());
v8::Context::Scope context_scope(context);
auto* unreferenced = cppgc::MakeGarbageCollected<Unreferenced>( auto* unreferenced = cppgc::MakeGarbageCollected<Unreferenced>(
allocation_handle(), allocation_handle(),
cppgc::AdditionalBytes(cppgc::internal::api_constants::kMB)); cppgc::AdditionalBytes(cppgc::internal::api_constants::kMB));
...@@ -178,8 +172,6 @@ TEST_F(UnifiedHeapTest, FreeUnreferencedDuringNoGcScope) { ...@@ -178,8 +172,6 @@ TEST_F(UnifiedHeapTest, FreeUnreferencedDuringNoGcScope) {
#if !V8_OS_FUCHSIA #if !V8_OS_FUCHSIA
TEST_F(UnifiedHeapTest, TracedReferenceRetainsFromStack) { TEST_F(UnifiedHeapTest, TracedReferenceRetainsFromStack) {
v8::HandleScope handle_scope(v8_isolate()); v8::HandleScope handle_scope(v8_isolate());
v8::Local<v8::Context> context = v8::Context::New(v8_isolate());
v8::Context::Scope context_scope(context);
TracedReference<v8::Object> holder; TracedReference<v8::Object> holder;
{ {
v8::HandleScope inner_handle_scope(v8_isolate()); v8::HandleScope inner_handle_scope(v8_isolate());
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment