Introduce FXGCScopedHeap type.
Ensures that global refcounts are adjusted when deleted.
-- move test setup/teardown into HeapEmbedderTest class.
Change-Id: I3c3c9abbdb18452484faadbd43c246df68a17c96
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/70515
Reviewed-by: Lei Zhang <thestig@chromium.org>
Commit-Queue: Tom Sepez <tsepez@chromium.org>
diff --git a/fxjs/gc/heap.cpp b/fxjs/gc/heap.cpp
index 02319eb..757d932 100644
--- a/fxjs/gc/heap.cpp
+++ b/fxjs/gc/heap.cpp
@@ -54,12 +54,13 @@
}
}
-std::unique_ptr<cppgc::Heap> FXGC_CreateHeap() {
+FXGCScopedHeap FXGC_CreateHeap() {
++g_platform_ref_count;
- return cppgc::Heap::Create(std::make_shared<CFXGC_Platform>());
+ auto heap = cppgc::Heap::Create(std::make_shared<CFXGC_Platform>());
+ return FXGCScopedHeap(heap.release());
}
-void FXGC_ReleaseHeap(std::unique_ptr<cppgc::Heap> heap) {
+void FXGCHeapDeleter::operator()(cppgc::Heap* heap) {
--g_platform_ref_count;
- // |heap| destroyed when it goes out of scope.
+ delete heap;
}
diff --git a/fxjs/gc/heap.h b/fxjs/gc/heap.h
index 2e25517..7792cbc 100644
--- a/fxjs/gc/heap.h
+++ b/fxjs/gc/heap.h
@@ -10,10 +10,14 @@
#include "v8/include/cppgc/heap.h"
#include "v8/include/libplatform/libplatform.h"
+struct FXGCHeapDeleter {
+ void operator()(cppgc::Heap* heap);
+};
+
+using FXGCScopedHeap = std::unique_ptr<cppgc::Heap, FXGCHeapDeleter>;
+
void FXGC_Initialize(v8::Platform* platform);
void FXGC_Release();
-
-std::unique_ptr<cppgc::Heap> FXGC_CreateHeap();
-void FXGC_ReleaseHeap(std::unique_ptr<cppgc::Heap> heap);
+FXGCScopedHeap FXGC_CreateHeap();
#endif // FXJS_GC_HEAP_H_
diff --git a/fxjs/gc/heap_embeddertest.cpp b/fxjs/gc/heap_embeddertest.cpp
index 8ee42ca..77dc90b 100644
--- a/fxjs/gc/heap_embeddertest.cpp
+++ b/fxjs/gc/heap_embeddertest.cpp
@@ -9,23 +9,26 @@
#include "testing/embedder_test.h"
#include "testing/gtest/include/gtest/gtest.h"
-class HeapEmbedderTest : public EmbedderTest {};
+class HeapEmbedderTest : public EmbedderTest {
+ public:
+ void SetUp() override {
+ EmbedderTest::SetUp();
+ FXGC_Initialize(EmbedderTestEnvironment::GetInstance()->platform());
+ }
-TEST(HeapEmbedderTest, SeveralHeaps) {
- FXGC_Initialize(EmbedderTestEnvironment::GetInstance()->platform());
+ void TearDown() override {
+ FXGC_Release();
+ EmbedderTest::TearDown();
+ }
+};
- std::unique_ptr<cppgc::Heap> heap1 = FXGC_CreateHeap();
+TEST_F(HeapEmbedderTest, SeveralHeaps) {
+ FXGCScopedHeap heap1 = FXGC_CreateHeap();
EXPECT_TRUE(heap1);
- std::unique_ptr<cppgc::Heap> heap2 = FXGC_CreateHeap();
+ FXGCScopedHeap heap2 = FXGC_CreateHeap();
EXPECT_TRUE(heap2);
- std::unique_ptr<cppgc::Heap> heap3 = FXGC_CreateHeap();
+ FXGCScopedHeap heap3 = FXGC_CreateHeap();
EXPECT_TRUE(heap2);
-
- FXGC_ReleaseHeap(std::move(heap1));
- FXGC_ReleaseHeap(std::move(heap2));
- FXGC_ReleaseHeap(std::move(heap3));
-
- FXGC_Release();
}