Fix CPPGC Plugin warnings for PDFium
- Pure virtual Trace() not allowed.
- Superfluous Trace() removed.
- Converted Keys in maps to members.
- Made nested classes be GC'd rather than uniquely owned.
- Improved ContainerTrace() macros for these purposes.
Bug: chromium:1421576
Change-Id: Ided5190f193f0bed97c8268fbcf99f9b03b9c007
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/104591
Commit-Queue: Tom Sepez <tsepez@chromium.org>
Reviewed-by: Nigi <nigi@chromium.org>
diff --git a/fxjs/gc/container_trace.h b/fxjs/gc/container_trace.h
index b7a5db8..dfe4a74 100644
--- a/fxjs/gc/container_trace.h
+++ b/fxjs/gc/container_trace.h
@@ -23,11 +23,29 @@
template <typename T, typename U, typename V = cppgc::Visitor>
void ContainerTrace(V* visitor,
+ const std::map<cppgc::Member<T>, U>& container) {
+ for (const auto& item : container) {
+ visitor->Trace(item.first);
+ }
+}
+
+template <typename T, typename U, typename V = cppgc::Visitor>
+void ContainerTrace(V* visitor,
const std::map<U, cppgc::Member<T>>& container) {
for (const auto& item : container)
visitor->Trace(item.second);
}
+template <typename T, typename U, typename V = cppgc::Visitor>
+void ContainerTrace(
+ V* visitor,
+ const std::map<cppgc::Member<U>, cppgc::Member<T>>& container) {
+ for (const auto& item : container) {
+ visitor->Trace(item.first);
+ visitor->Trace(item.second);
+ }
+}
+
template <typename T, typename V = cppgc::Visitor>
void ContainerTrace(V* visitor, const std::set<cppgc::Member<T>>& container) {
for (const auto& item : container)
diff --git a/fxjs/gc/container_trace_unittest.cpp b/fxjs/gc/container_trace_unittest.cpp
index f8f7769..9273afe 100644
--- a/fxjs/gc/container_trace_unittest.cpp
+++ b/fxjs/gc/container_trace_unittest.cpp
@@ -43,7 +43,16 @@
EXPECT_EQ(1, cv.call_count());
}
-TEST(ContainerTrace, ActualMapTrace) {
+TEST(ContainerTrace, ActualMapTraceFirst) {
+ std::map<cppgc::Member<Thing>, int> thing;
+ thing[nullptr] = 42;
+
+ CountingVisitor cv;
+ ContainerTrace(&cv, thing);
+ EXPECT_EQ(1, cv.call_count());
+}
+
+TEST(ContainerTrace, ActualMapTraceSecond) {
std::map<int, cppgc::Member<Thing>> thing;
thing[42] = nullptr;
@@ -52,6 +61,15 @@
EXPECT_EQ(1, cv.call_count());
}
+TEST(ContainerTrace, ActualMapTraceBoth) {
+ std::map<cppgc::Member<Thing>, cppgc::Member<Thing>> thing;
+ thing[nullptr] = nullptr;
+
+ CountingVisitor cv;
+ ContainerTrace(&cv, thing);
+ EXPECT_EQ(2, cv.call_count());
+}
+
TEST(ContainerTrace, ActualSetTrace) {
std::set<cppgc::Member<Thing>> thing;
thing.insert(nullptr);
diff --git a/fxjs/xfa/cfxjse_engine.h b/fxjs/xfa/cfxjse_engine.h
index 462cedf..c6a95c3 100644
--- a/fxjs/xfa/cfxjse_engine.h
+++ b/fxjs/xfa/cfxjse_engine.h
@@ -199,8 +199,10 @@
CXFA_Script::Type m_eScriptType = CXFA_Script::Type::Unknown;
// |m_mapObjectToValue| is what ensures the v8 object bound to a
// CJX_Object remains valid for the lifetime of the engine.
- std::map<CJX_Object*, v8::Global<v8::Object>> m_mapObjectToObject;
- std::map<CJX_Object*, std::unique_ptr<CFXJSE_Context>> m_mapVariableToContext;
+ std::map<cppgc::Persistent<CJX_Object>, v8::Global<v8::Object>>
+ m_mapObjectToObject;
+ std::map<cppgc::Persistent<CJX_Object>, std::unique_ptr<CFXJSE_Context>>
+ m_mapVariableToContext;
cppgc::Persistent<CXFA_Node> m_pTarget;
UnownedPtr<CXFA_EventParam> m_eventParam;
std::vector<cppgc::Persistent<CXFA_Node>> m_upObjectArray;
diff --git a/xfa/fwl/cfwl_app.cpp b/xfa/fwl/cfwl_app.cpp
index 39afbd6..250fcec 100644
--- a/xfa/fwl/cfwl_app.cpp
+++ b/xfa/fwl/cfwl_app.cpp
@@ -18,7 +18,8 @@
pAdapter->GetWidgetMgrAdapter(),
this)),
m_pNoteDriver(cppgc::MakeGarbageCollected<CFWL_NoteDriver>(
- pAdapter->GetHeap()->GetAllocationHandle())) {}
+ pAdapter->GetHeap()->GetAllocationHandle(),
+ this)) {}
CFWL_App::~CFWL_App() = default;
diff --git a/xfa/fwl/cfwl_notedriver.cpp b/xfa/fwl/cfwl_notedriver.cpp
index 35a110f..e6bcfe8 100644
--- a/xfa/fwl/cfwl_notedriver.cpp
+++ b/xfa/fwl/cfwl_notedriver.cpp
@@ -11,6 +11,7 @@
#include "build/build_config.h"
#include "core/fxcrt/fx_extension.h"
+#include "fxjs/gc/container_trace.h"
#include "xfa/fwl/cfwl_app.h"
#include "xfa/fwl/cfwl_event.h"
#include "xfa/fwl/cfwl_messagekey.h"
@@ -27,14 +28,13 @@
} // namespace
-CFWL_NoteDriver::CFWL_NoteDriver() = default;
+CFWL_NoteDriver::CFWL_NoteDriver(CFWL_App* pApp) : m_pApp(pApp) {}
CFWL_NoteDriver::~CFWL_NoteDriver() = default;
void CFWL_NoteDriver::Trace(cppgc::Visitor* visitor) const {
- for (const auto& item : m_eventTargets)
- item.second->Trace(visitor);
-
+ visitor->Trace(m_pApp);
+ ContainerTrace(visitor, m_eventTargets);
visitor->Trace(m_pHover);
visitor->Trace(m_pFocus);
visitor->Trace(m_pGrab);
@@ -54,9 +54,10 @@
key = g_next_listener_key++;
pListener->SetEventKey(key);
}
- if (!m_eventTargets[key])
- m_eventTargets[key] = std::make_unique<Target>(pListener);
-
+ if (!m_eventTargets[key]) {
+ m_eventTargets[key] = cppgc::MakeGarbageCollected<Target>(
+ m_pApp->GetHeap()->GetAllocationHandle(), pListener);
+ }
m_eventTargets[key]->SetEventSource(pEventSource);
}
diff --git a/xfa/fwl/cfwl_notedriver.h b/xfa/fwl/cfwl_notedriver.h
index 1f39ec1..00fd961 100644
--- a/xfa/fwl/cfwl_notedriver.h
+++ b/xfa/fwl/cfwl_notedriver.h
@@ -36,7 +36,7 @@
void SetGrab(CFWL_Widget* pGrab) { m_pGrab = pGrab; }
private:
- class Target {
+ class Target : public cppgc::GarbageCollected<Target> {
public:
explicit Target(CFWL_Widget* pListener);
~Target();
@@ -53,7 +53,7 @@
std::set<cppgc::Member<CFWL_Widget>> m_widgets;
};
- CFWL_NoteDriver();
+ explicit CFWL_NoteDriver(CFWL_App* pApp);
bool DispatchMessage(CFWL_Message* pMessage, CFWL_Widget* pMessageForm);
bool DoSetFocus(CFWL_Message* pMsg, CFWL_Widget* pMessageForm);
@@ -64,7 +64,8 @@
bool DoMouseEx(CFWL_Message* pMsg, CFWL_Widget* pMessageForm);
void MouseSecondary(CFWL_Message* pMsg);
- std::map<uint64_t, std::unique_ptr<Target>> m_eventTargets;
+ cppgc::Member<CFWL_App> m_pApp;
+ std::map<uint64_t, cppgc::Member<Target>> m_eventTargets;
cppgc::Member<CFWL_Widget> m_pHover;
cppgc::Member<CFWL_Widget> m_pFocus;
cppgc::Member<CFWL_Widget> m_pGrab;
diff --git a/xfa/fwl/cfwl_widgetmgr.cpp b/xfa/fwl/cfwl_widgetmgr.cpp
index 86c4938..b513415 100644
--- a/xfa/fwl/cfwl_widgetmgr.cpp
+++ b/xfa/fwl/cfwl_widgetmgr.cpp
@@ -7,6 +7,7 @@
#include "xfa/fwl/cfwl_widgetmgr.h"
#include "build/build_config.h"
+#include "fxjs/gc/container_trace.h"
#include "third_party/base/check.h"
#include "xfa/fwl/cfwl_app.h"
#include "xfa/fwl/cfwl_message.h"
@@ -25,8 +26,7 @@
void CFWL_WidgetMgr::Trace(cppgc::Visitor* visitor) const {
visitor->Trace(m_pApp);
visitor->Trace(m_pAdapter);
- for (auto& item : m_mapWidgetItem)
- visitor->Trace(item.second);
+ ContainerTrace(visitor, m_mapWidgetItem);
}
CFWL_Widget* CFWL_WidgetMgr::GetParentWidget(const CFWL_Widget* pWidget) const {
diff --git a/xfa/fwl/cfwl_widgetmgr.h b/xfa/fwl/cfwl_widgetmgr.h
index fe32047..8383f0f 100644
--- a/xfa/fwl/cfwl_widgetmgr.h
+++ b/xfa/fwl/cfwl_widgetmgr.h
@@ -94,7 +94,8 @@
cppgc::Member<AdapterIface> const m_pAdapter;
cppgc::Member<CFWL_App> const m_pApp;
- std::map<const CFWL_Widget*, cppgc::Member<Item>> m_mapWidgetItem;
+ std::map<cppgc::Member<const CFWL_Widget>, cppgc::Member<Item>>
+ m_mapWidgetItem;
};
#endif // XFA_FWL_CFWL_WIDGETMGR_H_
diff --git a/xfa/fxfa/cxfa_ffpageview.h b/xfa/fxfa/cxfa_ffpageview.h
index 9af01c0..32dd1d9 100644
--- a/xfa/fxfa/cxfa_ffpageview.h
+++ b/xfa/fxfa/cxfa_ffpageview.h
@@ -57,8 +57,6 @@
Mask<XFA_WidgetStatus> dwFilter);
~CXFA_FFPageWidgetIterator() override;
- void Trace(cppgc::Visitor* visitor) const {}
-
// CXFA_FFWidget::IteratorIface:
CXFA_FFWidget* MoveToFirst() override;
CXFA_FFWidget* MoveToLast() override;
diff --git a/xfa/fxfa/cxfa_textlayout.cpp b/xfa/fxfa/cxfa_textlayout.cpp
index a25c44c..10782c0 100644
--- a/xfa/fxfa/cxfa_textlayout.cpp
+++ b/xfa/fxfa/cxfa_textlayout.cpp
@@ -100,8 +100,7 @@
visitor->Trace(m_pTextProvider);
visitor->Trace(m_pTextDataNode);
visitor->Trace(m_pTextParser);
- if (m_pLoader)
- m_pLoader->Trace(visitor);
+ visitor->Trace(m_pLoader);
}
void CXFA_TextLayout::Unload() {
@@ -331,7 +330,8 @@
float CXFA_TextLayout::StartLayout(float fWidth) {
if (!m_pLoader)
- m_pLoader = std::make_unique<LoaderContext>();
+ m_pLoader = cppgc::MakeGarbageCollected<LoaderContext>(
+ m_pDoc->GetHeap()->GetAllocationHandle());
if (fWidth < 0 ||
(m_pLoader->fWidth > -1 && fabs(fWidth - m_pLoader->fWidth) > 0)) {
@@ -615,7 +615,7 @@
for (size_t i = 0; i < szBlockCount; ++i)
LayoutInternal(i);
m_pTabstopContext.reset();
- m_pLoader.reset();
+ m_pLoader.Clear();
}
std::vector<TextCharPos> char_pos(1);
diff --git a/xfa/fxfa/cxfa_textlayout.h b/xfa/fxfa/cxfa_textlayout.h
index 601b0f3..500a7af 100644
--- a/xfa/fxfa/cxfa_textlayout.h
+++ b/xfa/fxfa/cxfa_textlayout.h
@@ -98,7 +98,7 @@
float fHeight;
};
- struct LoaderContext {
+ struct LoaderContext : public cppgc::GarbageCollected<LoaderContext> {
LoaderContext();
~LoaderContext();
@@ -183,8 +183,8 @@
cppgc::Member<CXFA_TextProvider> const m_pTextProvider;
cppgc::Member<CXFA_Node> m_pTextDataNode;
cppgc::Member<CXFA_TextParser> m_pTextParser;
+ cppgc::Member<LoaderContext> m_pLoader;
std::unique_ptr<CFGAS_RTFBreak> m_pBreak;
- std::unique_ptr<LoaderContext> m_pLoader;
std::vector<std::unique_ptr<PieceLine>> m_pieceLines;
std::unique_ptr<CXFA_TextTabstopsContext> m_pTabstopContext;
};
diff --git a/xfa/fxfa/layout/cxfa_contentlayoutprocessor.cpp b/xfa/fxfa/layout/cxfa_contentlayoutprocessor.cpp
index fe1624a..1d827f3 100644
--- a/xfa/fxfa/layout/cxfa_contentlayoutprocessor.cpp
+++ b/xfa/fxfa/layout/cxfa_contentlayoutprocessor.cpp
@@ -652,6 +652,7 @@
visitor->Trace(m_pViewLayoutProcessor);
ContainerTrace(visitor, m_ArrayKeepItems);
ContainerTrace(visitor, m_PendingNodes);
+ ContainerTrace(visitor, m_PendingNodesCount);
}
CXFA_ContentLayoutItem* CXFA_ContentLayoutProcessor::CreateContentLayoutItem(
diff --git a/xfa/fxfa/layout/cxfa_contentlayoutprocessor.h b/xfa/fxfa/layout/cxfa_contentlayoutprocessor.h
index 5257555..fac5673 100644
--- a/xfa/fxfa/layout/cxfa_contentlayoutprocessor.h
+++ b/xfa/fxfa/layout/cxfa_contentlayoutprocessor.h
@@ -237,7 +237,7 @@
std::vector<float> m_rgSpecifiedColumnWidths;
std::vector<cppgc::Member<CXFA_ContentLayoutItem>> m_ArrayKeepItems;
std::list<cppgc::Member<CXFA_Node>> m_PendingNodes;
- std::map<CXFA_Node*, int32_t> m_PendingNodesCount;
+ std::map<cppgc::Member<CXFA_Node>, int32_t> m_PendingNodesCount;
cppgc::Member<CXFA_ContentLayoutProcessor> m_pCurChildPreprocessor;
};
diff --git a/xfa/fxfa/layout/cxfa_viewlayoutprocessor.cpp b/xfa/fxfa/layout/cxfa_viewlayoutprocessor.cpp
index 353b376..b56c377 100644
--- a/xfa/fxfa/layout/cxfa_viewlayoutprocessor.cpp
+++ b/xfa/fxfa/layout/cxfa_viewlayoutprocessor.cpp
@@ -359,13 +359,13 @@
visitor->Trace(m_pCurPageArea);
visitor->Trace(m_pPageSetRootLayoutItem);
visitor->Trace(m_pPageSetCurLayoutItem);
- for (const auto& record : m_ProposedViewRecords)
- visitor->Trace(*record);
+ ContainerTrace(visitor, m_ProposedViewRecords);
if (m_CurrentViewRecordIter != m_ProposedViewRecords.end())
visitor->Trace(*m_CurrentViewRecordIter);
ContainerTrace(visitor, m_PageArray);
+ ContainerTrace(visitor, m_pPageSetMap);
}
bool CXFA_ViewLayoutProcessor::InitLayoutPage(CXFA_Node* pFormNode) {
diff --git a/xfa/fxfa/layout/cxfa_viewlayoutprocessor.h b/xfa/fxfa/layout/cxfa_viewlayoutprocessor.h
index 1463827..e48c9df 100644
--- a/xfa/fxfa/layout/cxfa_viewlayoutprocessor.h
+++ b/xfa/fxfa/layout/cxfa_viewlayoutprocessor.h
@@ -193,7 +193,7 @@
int32_t m_nCurPageCount = 0;
XFA_AttributeValue m_ePageSetMode = XFA_AttributeValue::OrderedOccurrence;
bool m_bCreateOverFlowPage = false;
- std::map<CXFA_Node*, int32_t> m_pPageSetMap;
+ std::map<cppgc::Member<CXFA_Node>, int32_t> m_pPageSetMap;
std::vector<cppgc::Member<CXFA_ViewLayoutItem>> m_PageArray;
};
diff --git a/xfa/fxfa/parser/cxfa_nodelocale.cpp b/xfa/fxfa/parser/cxfa_nodelocale.cpp
index 9b8a84f..60a44de 100644
--- a/xfa/fxfa/parser/cxfa_nodelocale.cpp
+++ b/xfa/fxfa/parser/cxfa_nodelocale.cpp
@@ -43,6 +43,7 @@
CXFA_NodeLocale::~CXFA_NodeLocale() = default;
void CXFA_NodeLocale::Trace(cppgc::Visitor* visitor) const {
+ GCedLocaleIface::Trace(visitor);
visitor->Trace(m_pNode);
}
diff --git a/xfa/fxfa/parser/cxfa_xmllocale.cpp b/xfa/fxfa/parser/cxfa_xmllocale.cpp
index ebc6402..8395680 100644
--- a/xfa/fxfa/parser/cxfa_xmllocale.cpp
+++ b/xfa/fxfa/parser/cxfa_xmllocale.cpp
@@ -58,7 +58,9 @@
CXFA_XMLLocale::~CXFA_XMLLocale() = default;
-void CXFA_XMLLocale::Trace(cppgc::Visitor* visitor) const {}
+void CXFA_XMLLocale::Trace(cppgc::Visitor* visitor) const {
+ GCedLocaleIface::Trace(visitor);
+}
WideString CXFA_XMLLocale::GetName() const {
return locale_->GetAttribute(L"name");
diff --git a/xfa/fxfa/parser/gced_locale_iface.h b/xfa/fxfa/parser/gced_locale_iface.h
index a4d6d9e..7d4ca63 100644
--- a/xfa/fxfa/parser/gced_locale_iface.h
+++ b/xfa/fxfa/parser/gced_locale_iface.h
@@ -13,7 +13,7 @@
class GCedLocaleIface : public cppgc::GarbageCollected<GCedLocaleIface>,
public LocaleIface {
public:
- virtual void Trace(cppgc::Visitor* visitor) const = 0;
+ virtual void Trace(cppgc::Visitor* visitor) const {}
};
#endif // XFA_FXFA_PARSER_GCED_LOCALE_IFACE_H_