From 7d09808818c561f844a4e4ba2e50636a7bd8f01d Mon Sep 17 00:00:00 2001 From: Dmitri Gribenko Date: Mon, 18 Feb 2013 19:50:38 +0000 Subject: [PATCH] libclang: don't store nul-terminated strings as StringRefs, if the nul-terminatedness property is important for clients. Also, don't return the same CXString multiple times. This did not create a correctness issue in practice because the CXString was of an CXS_Unmanaged kind, and destruction was a no-op. llvm-svn: 175455 --- clang/tools/libclang/CXLoadedDiagnostic.cpp | 27 +++++++++++++-------------- clang/tools/libclang/CXLoadedDiagnostic.h | 4 ++-- 2 files changed, 15 insertions(+), 16 deletions(-) diff --git a/clang/tools/libclang/CXLoadedDiagnostic.cpp b/clang/tools/libclang/CXLoadedDiagnostic.cpp index b89080f..766ea34 100644 --- a/clang/tools/libclang/CXLoadedDiagnostic.cpp +++ b/clang/tools/libclang/CXLoadedDiagnostic.cpp @@ -29,7 +29,7 @@ using namespace clang; // Extend CXDiagnosticSetImpl which contains strings for diagnostics. //===----------------------------------------------------------------------===// -typedef llvm::DenseMap Strings; +typedef llvm::DenseMap Strings; namespace { class CXLoadedDiagnosticSetImpl : public CXDiagnosticSetImpl { @@ -45,14 +45,13 @@ public: FileSystemOptions FO; FileManager FakeFiles; llvm::DenseMap Files; - - llvm::StringRef makeString(StringRef Blob) { + + /// \brief Copy the string into our own allocator. + const char *copyString(StringRef Blob) { char *mem = Alloc.Allocate(Blob.size() + 1); memcpy(mem, Blob.data(), Blob.size()); - // Add a null terminator for those clients accessing the buffer - // like a c-string. mem[Blob.size()] = '\0'; - return llvm::StringRef(mem, Blob.size()); + return mem; } }; } @@ -135,7 +134,7 @@ CXString CXLoadedDiagnostic::getFixIt(unsigned FixIt, assert(FixIt < FixIts.size()); if (ReplacementRange) *ReplacementRange = FixIts[FixIt].first; - return FixIts[FixIt].second; + return cxstring::createRef(FixIts[FixIt].second); } void CXLoadedDiagnostic::decodeLocation(CXSourceLocation location, @@ -220,7 +219,7 @@ class DiagLoader { bool allowEmptyString = false); LoadResult readString(CXLoadedDiagnosticSetImpl &TopDiags, - llvm::StringRef &RetStr, + const char *&RetStr, llvm::StringRef errorContext, RecordData &Record, StringRef Blob, @@ -434,7 +433,7 @@ LoadResult DiagLoader::readMetaBlock(llvm::BitstreamCursor &Stream) { } LoadResult DiagLoader::readString(CXLoadedDiagnosticSetImpl &TopDiags, - llvm::StringRef &RetStr, + const char *&RetStr, llvm::StringRef errorContext, RecordData &Record, StringRef Blob, @@ -458,7 +457,7 @@ LoadResult DiagLoader::readString(CXLoadedDiagnosticSetImpl &TopDiags, return Failure; } - RetStr = TopDiags.makeString(Blob); + RetStr = TopDiags.copyString(Blob); return Success; } @@ -468,7 +467,7 @@ LoadResult DiagLoader::readString(CXLoadedDiagnosticSetImpl &TopDiags, RecordData &Record, StringRef Blob, bool allowEmptyString) { - llvm::StringRef RetStr; + const char *RetStr; if (readString(TopDiags, RetStr, errorContext, Record, Blob, allowEmptyString)) return Failure; @@ -622,11 +621,11 @@ LoadResult DiagLoader::readDiagnosticBlock(llvm::BitstreamCursor &Stream, CXSourceRange SR; if (readRange(TopDiags, Record, 0, SR)) return Failure; - llvm::StringRef RetStr; + const char *RetStr; if (readString(TopDiags, RetStr, "FIXIT", Record, Blob, /* allowEmptyString */ true)) return Failure; - D->FixIts.push_back(std::make_pair(SR, cxstring::createRef(RetStr))); + D->FixIts.push_back(std::make_pair(SR, RetStr)); continue; } @@ -639,7 +638,7 @@ LoadResult DiagLoader::readDiagnosticBlock(llvm::BitstreamCursor &Stream, unsigned diagFlag = Record[offset++]; D->DiagOption = diagFlag ? TopDiags.WarningFlags[diagFlag] : ""; D->CategoryText = D->category ? TopDiags.Categories[D->category] : ""; - D->Spelling = TopDiags.makeString(Blob); + D->Spelling = TopDiags.copyString(Blob); continue; } } diff --git a/clang/tools/libclang/CXLoadedDiagnostic.h b/clang/tools/libclang/CXLoadedDiagnostic.h index d4a321e..d4b11d5 100644 --- a/clang/tools/libclang/CXLoadedDiagnostic.h +++ b/clang/tools/libclang/CXLoadedDiagnostic.h @@ -82,8 +82,8 @@ public: Location DiagLoc; std::vector Ranges; - std::vector > FixIts; - llvm::StringRef Spelling; + std::vector > FixIts; + const char *Spelling; llvm::StringRef DiagOption; llvm::StringRef CategoryText; unsigned severity; -- 2.7.4