Reland "[llvm-mt] Use XmlDeleter to free xmlFreeDoc"" (#128579)

Reverts llvm/llvm-project#128578 to reland llvm/llvm-project#128472.
This commit is contained in:
Vitaly Buka 2025-02-24 14:30:38 -08:00 committed by GitHub
parent 36b339b84a
commit 6b444271a0
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -32,7 +32,6 @@ void WindowsManifestError::log(raw_ostream &OS) const { OS << Msg; }
class WindowsManifestMerger::WindowsManifestMergerImpl { class WindowsManifestMerger::WindowsManifestMergerImpl {
public: public:
~WindowsManifestMergerImpl();
Error merge(MemoryBufferRef Manifest); Error merge(MemoryBufferRef Manifest);
std::unique_ptr<MemoryBuffer> getMergedManifest(); std::unique_ptr<MemoryBuffer> getMergedManifest();
@ -45,7 +44,7 @@ private:
void operator()(xmlDoc *Ptr) { xmlFreeDoc(Ptr); } void operator()(xmlDoc *Ptr) { xmlFreeDoc(Ptr); }
}; };
xmlDocPtr CombinedDoc = nullptr; xmlDocPtr CombinedDoc = nullptr;
std::vector<xmlDocPtr> MergedDocs; std::vector<std::unique_ptr<xmlDoc, XmlDeleter>> MergedDocs;
bool Merged = false; bool Merged = false;
int BufferSize = 0; int BufferSize = 0;
std::unique_ptr<xmlChar, XmlDeleter> Buffer; std::unique_ptr<xmlChar, XmlDeleter> Buffer;
@ -611,11 +610,6 @@ static void checkAndStripPrefixes(xmlNodePtr Node,
} }
} }
WindowsManifestMerger::WindowsManifestMergerImpl::~WindowsManifestMergerImpl() {
for (auto &Doc : MergedDocs)
xmlFreeDoc(Doc);
}
Error WindowsManifestMerger::WindowsManifestMergerImpl::merge( Error WindowsManifestMerger::WindowsManifestMergerImpl::merge(
MemoryBufferRef Manifest) { MemoryBufferRef Manifest) {
if (Merged) if (Merged)
@ -626,17 +620,17 @@ Error WindowsManifestMerger::WindowsManifestMergerImpl::merge(
"attempted to merge empty manifest"); "attempted to merge empty manifest");
xmlSetGenericErrorFunc((void *)this, xmlSetGenericErrorFunc((void *)this,
WindowsManifestMergerImpl::errorCallback); WindowsManifestMergerImpl::errorCallback);
xmlDocPtr ManifestXML = xmlReadMemory( std::unique_ptr<xmlDoc, XmlDeleter> ManifestXML(xmlReadMemory(
Manifest.getBufferStart(), Manifest.getBufferSize(), "manifest.xml", Manifest.getBufferStart(), Manifest.getBufferSize(), "manifest.xml",
nullptr, XML_PARSE_NOBLANKS | XML_PARSE_NODICT); nullptr, XML_PARSE_NOBLANKS | XML_PARSE_NODICT));
xmlSetGenericErrorFunc(nullptr, nullptr); xmlSetGenericErrorFunc(nullptr, nullptr);
if (auto E = getParseError()) if (auto E = getParseError())
return E; return E;
xmlNodePtr AdditionalRoot = xmlDocGetRootElement(ManifestXML); xmlNodePtr AdditionalRoot = xmlDocGetRootElement(ManifestXML.get());
stripComments(AdditionalRoot); stripComments(AdditionalRoot);
setAttributeNamespaces(AdditionalRoot); setAttributeNamespaces(AdditionalRoot);
if (CombinedDoc == nullptr) { if (CombinedDoc == nullptr) {
CombinedDoc = ManifestXML; CombinedDoc = ManifestXML.get();
} else { } else {
xmlNodePtr CombinedRoot = xmlDocGetRootElement(CombinedDoc); xmlNodePtr CombinedRoot = xmlDocGetRootElement(CombinedDoc);
if (!xmlStringsEqual(CombinedRoot->name, AdditionalRoot->name) || if (!xmlStringsEqual(CombinedRoot->name, AdditionalRoot->name) ||
@ -648,7 +642,7 @@ Error WindowsManifestMerger::WindowsManifestMergerImpl::merge(
return E; return E;
} }
} }
MergedDocs.push_back(ManifestXML); MergedDocs.push_back(std::move(ManifestXML));
return Error::success(); return Error::success();
} }
@ -682,9 +676,6 @@ bool windows_manifest::isAvailable() { return true; }
#else #else
WindowsManifestMerger::WindowsManifestMergerImpl::~WindowsManifestMergerImpl() {
}
Error WindowsManifestMerger::WindowsManifestMergerImpl::merge( Error WindowsManifestMerger::WindowsManifestMergerImpl::merge(
MemoryBufferRef Manifest) { MemoryBufferRef Manifest) {
return make_error<WindowsManifestError>("no libxml2"); return make_error<WindowsManifestError>("no libxml2");