Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nodejs/node.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/test/unittests/heap/cppgc/custom-spaces-unittest.cc')
-rw-r--r--deps/v8/test/unittests/heap/cppgc/custom-spaces-unittest.cc130
1 files changed, 130 insertions, 0 deletions
diff --git a/deps/v8/test/unittests/heap/cppgc/custom-spaces-unittest.cc b/deps/v8/test/unittests/heap/cppgc/custom-spaces-unittest.cc
new file mode 100644
index 00000000000..3fb0b13705c
--- /dev/null
+++ b/deps/v8/test/unittests/heap/cppgc/custom-spaces-unittest.cc
@@ -0,0 +1,130 @@
+// Copyright 2020 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "include/cppgc/allocation.h"
+#include "include/cppgc/custom-space.h"
+#include "src/heap/cppgc/heap-page.h"
+#include "src/heap/cppgc/raw-heap.h"
+#include "test/unittests/heap/cppgc/tests.h"
+
+namespace cppgc {
+
+class CustomSpace1 : public CustomSpace<CustomSpace1> {
+ public:
+ static constexpr size_t kSpaceIndex = 0;
+};
+
+class CustomSpace2 : public CustomSpace<CustomSpace2> {
+ public:
+ static constexpr size_t kSpaceIndex = 1;
+};
+
+namespace internal {
+
+namespace {
+
+size_t g_destructor_callcount;
+
+class TestWithHeapWithCustomSpaces : public testing::TestWithPlatform {
+ protected:
+ TestWithHeapWithCustomSpaces() {
+ Heap::HeapOptions options;
+ options.custom_spaces.emplace_back(std::make_unique<CustomSpace1>());
+ options.custom_spaces.emplace_back(std::make_unique<CustomSpace2>());
+ heap_ = Heap::Create(std::move(options));
+ g_destructor_callcount = 0;
+ }
+
+ void PreciseGC() {
+ heap_->ForceGarbageCollectionSlow(
+ "TestWithHeapWithCustomSpaces", "Testing",
+ Heap::GCConfig::StackState::kNoHeapPointers);
+ }
+
+ cppgc::Heap* GetHeap() const { return heap_.get(); }
+
+ private:
+ std::unique_ptr<cppgc::Heap> heap_;
+};
+
+class RegularGCed final : public GarbageCollected<RegularGCed> {};
+
+class CustomGCed1 final : public GarbageCollected<CustomGCed1> {
+ public:
+ ~CustomGCed1() { g_destructor_callcount++; }
+};
+class CustomGCed2 final : public GarbageCollected<CustomGCed2> {
+ public:
+ ~CustomGCed2() { g_destructor_callcount++; }
+};
+
+class CustomGCedBase : public GarbageCollected<CustomGCedBase> {};
+class CustomGCedFinal1 final : public CustomGCedBase {
+ public:
+ ~CustomGCedFinal1() { g_destructor_callcount++; }
+};
+class CustomGCedFinal2 final : public CustomGCedBase {
+ public:
+ ~CustomGCedFinal2() { g_destructor_callcount++; }
+};
+
+} // namespace
+
+} // namespace internal
+
+template <>
+struct SpaceTrait<internal::CustomGCed1> {
+ using Space = CustomSpace1;
+};
+
+template <>
+struct SpaceTrait<internal::CustomGCed2> {
+ using Space = CustomSpace2;
+};
+
+template <typename T>
+struct SpaceTrait<
+ T, std::enable_if_t<std::is_base_of<internal::CustomGCedBase, T>::value>> {
+ using Space = CustomSpace1;
+};
+
+namespace internal {
+
+TEST_F(TestWithHeapWithCustomSpaces, AllocateOnCustomSpaces) {
+ auto* regular = MakeGarbageCollected<RegularGCed>(GetHeap());
+ auto* custom1 = MakeGarbageCollected<CustomGCed1>(GetHeap());
+ auto* custom2 = MakeGarbageCollected<CustomGCed2>(GetHeap());
+ EXPECT_EQ(RawHeap::kNumberOfRegularSpaces,
+ NormalPage::FromPayload(custom1)->space()->index());
+ EXPECT_EQ(RawHeap::kNumberOfRegularSpaces + 1,
+ NormalPage::FromPayload(custom2)->space()->index());
+ EXPECT_EQ(static_cast<size_t>(RawHeap::RegularSpaceType::kNormal1),
+ NormalPage::FromPayload(regular)->space()->index());
+}
+
+TEST_F(TestWithHeapWithCustomSpaces,
+ AllocateOnCustomSpacesSpecifiedThroughBase) {
+ auto* regular = MakeGarbageCollected<RegularGCed>(GetHeap());
+ auto* custom1 = MakeGarbageCollected<CustomGCedFinal1>(GetHeap());
+ auto* custom2 = MakeGarbageCollected<CustomGCedFinal2>(GetHeap());
+ EXPECT_EQ(RawHeap::kNumberOfRegularSpaces,
+ NormalPage::FromPayload(custom1)->space()->index());
+ EXPECT_EQ(RawHeap::kNumberOfRegularSpaces,
+ NormalPage::FromPayload(custom2)->space()->index());
+ EXPECT_EQ(static_cast<size_t>(RawHeap::RegularSpaceType::kNormal1),
+ NormalPage::FromPayload(regular)->space()->index());
+}
+
+TEST_F(TestWithHeapWithCustomSpaces, SweepCustomSpace) {
+ MakeGarbageCollected<CustomGCedFinal1>(GetHeap());
+ MakeGarbageCollected<CustomGCedFinal2>(GetHeap());
+ MakeGarbageCollected<CustomGCed1>(GetHeap());
+ MakeGarbageCollected<CustomGCed2>(GetHeap());
+ EXPECT_EQ(0u, g_destructor_callcount);
+ PreciseGC();
+ EXPECT_EQ(4u, g_destructor_callcount);
+}
+
+} // namespace internal
+} // namespace cppgc