Make CFXA_DocumentBuilder a stack-only type.
Slowly working to elminiate make_unique<CXFA_*>.
Change-Id: I987d29a50141aafb3275cb223ba04e91421b3ae7
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/73292
Commit-Queue: Tom Sepez <tsepez@chromium.org>
Reviewed-by: Lei Zhang <thestig@chromium.org>
diff --git a/fxjs/xfa/cjx_node.cpp b/fxjs/xfa/cjx_node.cpp
index 642eda8..ba7145f 100644
--- a/fxjs/xfa/cjx_node.cpp
+++ b/fxjs/xfa/cjx_node.cpp
@@ -271,8 +271,8 @@
CFX_XMLParser parser(stream);
std::unique_ptr<CFX_XMLDocument> xml_doc = parser.Parse();
- auto builder = std::make_unique<CXFA_DocumentBuilder>(GetDocument());
- CFX_XMLNode* pXMLNode = builder->Build(xml_doc.get());
+ CXFA_DocumentBuilder builder(GetDocument());
+ CFX_XMLNode* pXMLNode = builder.Build(xml_doc.get());
if (!pXMLNode)
return CJS_Result::Success();
@@ -319,8 +319,8 @@
pFakeXMLRoot->AppendLastChild(pXMLNode);
}
- builder->ConstructXFANode(pFakeRoot, pFakeXMLRoot);
- pFakeRoot = builder->GetRootNode();
+ builder.ConstructXFANode(pFakeRoot, pFakeXMLRoot);
+ pFakeRoot = builder.GetRootNode();
if (!pFakeRoot)
return CJS_Result::Success();
diff --git a/xfa/fxfa/parser/cxfa_document_builder.h b/xfa/fxfa/parser/cxfa_document_builder.h
index 613aa92..a6ee86c 100644
--- a/xfa/fxfa/parser/cxfa_document_builder.h
+++ b/xfa/fxfa/parser/cxfa_document_builder.h
@@ -10,7 +10,8 @@
#include <utility>
#include "core/fxcrt/fx_string.h"
-#include "v8/include/cppgc/persistent.h"
+#include "core/fxcrt/unowned_ptr.h"
+#include "v8/include/cppgc/macros.h"
#include "xfa/fxfa/fxfa_basic.h"
class CFX_XMLDocument;
@@ -20,6 +21,8 @@
class CFX_XMLInstruction;
class CXFA_DocumentBuilder {
+ CPPGC_STACK_ALLOCATED(); // Allow Raw/Unowned pointers.
+
public:
explicit CXFA_DocumentBuilder(CXFA_Document* pNodeFactory);
~CXFA_DocumentBuilder();
@@ -63,8 +66,8 @@
CFX_XMLInstruction* pXMLInstruction,
XFA_PacketType ePacketID);
- cppgc::Persistent<CXFA_Document> node_factory_;
- cppgc::Persistent<CXFA_Node> root_node_;
+ UnownedPtr<CXFA_Document> node_factory_;
+ UnownedPtr<CXFA_Node> root_node_;
UnownedPtr<CFX_XMLDocument> xml_doc_;
size_t execute_recursion_depth_ = 0;
};
diff --git a/xfa/fxfa/parser/cxfa_document_builder_unittest.cpp b/xfa/fxfa/parser/cxfa_document_builder_unittest.cpp
index 63283a1..12cdf9f 100644
--- a/xfa/fxfa/parser/cxfa_document_builder_unittest.cpp
+++ b/xfa/fxfa/parser/cxfa_document_builder_unittest.cpp
@@ -19,11 +19,9 @@
FXGCUnitTest::SetUp();
doc_ = cppgc::MakeGarbageCollected<CXFA_Document>(
heap()->GetAllocationHandle(), nullptr, heap(), nullptr);
- builder_ = std::make_unique<CXFA_DocumentBuilder>(doc_);
}
void TearDown() override {
- builder_.reset();
doc_ = nullptr;
FXGCUnitTest::TearDown();
}
@@ -34,14 +32,15 @@
xml_ = CFX_XMLParser(stream).Parse();
if (!xml_)
return nullptr;
- if (!builder_->BuildDocument(xml_.get(), XFA_PacketType::Config))
+
+ CXFA_DocumentBuilder builder(doc_);
+ if (!builder.BuildDocument(xml_.get(), XFA_PacketType::Config))
return nullptr;
- return builder_->GetRootNode();
+ return builder.GetRootNode();
}
private:
std::unique_ptr<CFX_XMLDocument> xml_;
- std::unique_ptr<CXFA_DocumentBuilder> builder_;
cppgc::Persistent<CXFA_Document> doc_;
};