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(); }