summaryrefslogtreecommitdiffstats
path: root/tools/libclang/CXLoadedDiagnostic.cpp
diff options
context:
space:
mode:
authorDmitri Gribenko <gribozavr@gmail.com>2013-02-18 19:50:38 +0000
committerDmitri Gribenko <gribozavr@gmail.com>2013-02-18 19:50:38 +0000
commit9ba7627d25a7555b1afff04f685d2f161974e682 (patch)
tree4c99af73e53f6ff1ef567c364c81d1d46bfedcf2 /tools/libclang/CXLoadedDiagnostic.cpp
parent5be093c0ef46c7749c942d0d9056af6dc3d591a4 (diff)
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. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@175455 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'tools/libclang/CXLoadedDiagnostic.cpp')
-rw-r--r--tools/libclang/CXLoadedDiagnostic.cpp27
1 files changed, 13 insertions, 14 deletions
diff --git a/tools/libclang/CXLoadedDiagnostic.cpp b/tools/libclang/CXLoadedDiagnostic.cpp
index b89080f099..766ea3480a 100644
--- a/tools/libclang/CXLoadedDiagnostic.cpp
+++ b/tools/libclang/CXLoadedDiagnostic.cpp
@@ -29,7 +29,7 @@ using namespace clang;
// Extend CXDiagnosticSetImpl which contains strings for diagnostics.
//===----------------------------------------------------------------------===//
-typedef llvm::DenseMap<unsigned, llvm::StringRef> Strings;
+typedef llvm::DenseMap<unsigned, const char *> Strings;
namespace {
class CXLoadedDiagnosticSetImpl : public CXDiagnosticSetImpl {
@@ -45,14 +45,13 @@ public:
FileSystemOptions FO;
FileManager FakeFiles;
llvm::DenseMap<unsigned, const FileEntry *> Files;
-
- llvm::StringRef makeString(StringRef Blob) {
+
+ /// \brief Copy the string into our own allocator.
+ const char *copyString(StringRef Blob) {
char *mem = Alloc.Allocate<char>(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;
}
}