[llvm] [llvm-mt] Use XmlDeleter to free xmlFreeDoc (PR #128472)

Vitaly Buka via llvm-commits llvm-commits at lists.llvm.org
Sun Feb 23 22:41:37 PST 2025


https://github.com/vitalybuka updated https://github.com/llvm/llvm-project/pull/128472

>From 9f4796eaf35271378c4d001317b57b80ca8730a0 Mon Sep 17 00:00:00 2001
From: Vitaly Buka <vitalybuka at google.com>
Date: Sun, 23 Feb 2025 22:30:53 -0800
Subject: [PATCH] =?UTF-8?q?[=F0=9D=98=80=F0=9D=97=BD=F0=9D=97=BF]=20initia?=
 =?UTF-8?q?l=20version?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Created using spr 1.3.4
---
 .../WindowsManifest/WindowsManifestMerger.cpp | 20 +++++++++----------
 1 file changed, 9 insertions(+), 11 deletions(-)

diff --git a/llvm/lib/WindowsManifest/WindowsManifestMerger.cpp b/llvm/lib/WindowsManifest/WindowsManifestMerger.cpp
index b59b666ce04f9..4dd326fa76e01 100644
--- a/llvm/lib/WindowsManifest/WindowsManifestMerger.cpp
+++ b/llvm/lib/WindowsManifest/WindowsManifestMerger.cpp
@@ -40,14 +40,14 @@ class WindowsManifestMerger::WindowsManifestMergerImpl {
   static void errorCallback(void *Ctx, const char *Format, ...);
   Error getParseError();
 #if LLVM_ENABLE_LIBXML2
-  xmlDocPtr CombinedDoc = nullptr;
-  std::vector<xmlDocPtr> MergedDocs;
-
-  bool Merged = false;
   struct XmlDeleter {
     void operator()(xmlChar *Ptr) { xmlFree(Ptr); }
     void operator()(xmlDoc *Ptr) { xmlFreeDoc(Ptr); }
   };
+  xmlDocPtr CombinedDoc = nullptr;
+  std::vector<std::unique_ptr<xmlDoc, XmlDeleter>> MergedDocs;
+
+  bool Merged = false;
   int BufferSize = 0;
   std::unique_ptr<xmlChar, XmlDeleter> Buffer;
 #endif
@@ -613,8 +613,6 @@ static void checkAndStripPrefixes(xmlNodePtr Node,
 }
 
 WindowsManifestMerger::WindowsManifestMergerImpl::~WindowsManifestMergerImpl() {
-  for (auto &Doc : MergedDocs)
-    xmlFreeDoc(Doc);
 }
 
 Error WindowsManifestMerger::WindowsManifestMergerImpl::merge(
@@ -627,17 +625,17 @@ Error WindowsManifestMerger::WindowsManifestMergerImpl::merge(
         "attempted to merge empty manifest");
   xmlSetGenericErrorFunc((void *)this,
                          WindowsManifestMergerImpl::errorCallback);
-  xmlDocPtr ManifestXML = xmlReadMemory(
+  std::unique_ptr<xmlDoc, XmlDeleter> ManifestXML(xmlReadMemory(
       Manifest.getBufferStart(), Manifest.getBufferSize(), "manifest.xml",
-      nullptr, XML_PARSE_NOBLANKS | XML_PARSE_NODICT);
+      nullptr, XML_PARSE_NOBLANKS | XML_PARSE_NODICT));
   xmlSetGenericErrorFunc(nullptr, nullptr);
   if (auto E = getParseError())
     return E;
-  xmlNodePtr AdditionalRoot = xmlDocGetRootElement(ManifestXML);
+  xmlNodePtr AdditionalRoot = xmlDocGetRootElement(ManifestXML.get());
   stripComments(AdditionalRoot);
   setAttributeNamespaces(AdditionalRoot);
   if (CombinedDoc == nullptr) {
-    CombinedDoc = ManifestXML;
+    CombinedDoc = ManifestXML.get();
   } else {
     xmlNodePtr CombinedRoot = xmlDocGetRootElement(CombinedDoc);
     if (!xmlStringsEqual(CombinedRoot->name, AdditionalRoot->name) ||
@@ -649,7 +647,7 @@ Error WindowsManifestMerger::WindowsManifestMergerImpl::merge(
       return E;
     }
   }
-  MergedDocs.push_back(ManifestXML);
+  MergedDocs.push_back(std::move(ManifestXML));
   return Error::success();
 }
 



More information about the llvm-commits mailing list