summaryrefslogtreecommitdiffstats
path: root/clang/tools/libclang/CIndexCodeCompletion.cpp
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2010-08-04 17:07:00 +0000
committerDouglas Gregor <dgregor@apple.com>2010-08-04 17:07:00 +0000
commitd8a5dba9c2c09c335d8b6b6a2675da6477f329b3 (patch)
tree9ae6acb748769be92ba600d552c5849d60ffd0a4 /clang/tools/libclang/CIndexCodeCompletion.cpp
parent1bcc697c2a51918cafbb42f8d8f783d167cb27eb (diff)
downloadbcm5719-llvm-d8a5dba9c2c09c335d8b6b6a2675da6477f329b3.tar.gz
bcm5719-llvm-d8a5dba9c2c09c335d8b6b6a2675da6477f329b3.zip
When performing in-process code completion, don't free the remapped
file buffers until the code completion results are destroyed; diagnostics may end up referring into the source. llvm-svn: 110216
Diffstat (limited to 'clang/tools/libclang/CIndexCodeCompletion.cpp')
-rw-r--r--clang/tools/libclang/CIndexCodeCompletion.cpp22
1 files changed, 12 insertions, 10 deletions
diff --git a/clang/tools/libclang/CIndexCodeCompletion.cpp b/clang/tools/libclang/CIndexCodeCompletion.cpp
index f8fd470a1d8..2aa644b7579 100644
--- a/clang/tools/libclang/CIndexCodeCompletion.cpp
+++ b/clang/tools/libclang/CIndexCodeCompletion.cpp
@@ -224,10 +224,6 @@ struct AllocatedCXCodeCompleteResults : public CXCodeCompleteResults {
AllocatedCXCodeCompleteResults();
~AllocatedCXCodeCompleteResults();
- /// \brief The memory buffer from which we parsed the results. We
- /// retain this buffer because the completion strings point into it.
- llvm::MemoryBuffer *Buffer;
-
/// \brief Diagnostics produced while performing code completion.
llvm::SmallVector<StoredDiagnostic, 8> Diagnostics;
@@ -246,20 +242,23 @@ struct AllocatedCXCodeCompleteResults : public CXCodeCompleteResults {
/// \brief Temporary files that should be removed once we have finished
/// with the code-completion results.
std::vector<llvm::sys::Path> TemporaryFiles;
+
+ /// \brief Temporary buffers that will be deleted once we have finished with the code-completion results.
+ llvm::SmallVector<const llvm::MemoryBuffer *, 1> TemporaryBuffers;
};
AllocatedCXCodeCompleteResults::AllocatedCXCodeCompleteResults()
- : CXCodeCompleteResults(), Buffer(0), Diag(new Diagnostic),
- SourceMgr(*Diag) { }
+ : CXCodeCompleteResults(), Diag(new Diagnostic), SourceMgr(*Diag) { }
AllocatedCXCodeCompleteResults::~AllocatedCXCodeCompleteResults() {
for (unsigned I = 0, N = NumResults; I != N; ++I)
delete (CXStoredCodeCompletionString *)Results[I].CompletionString;
delete [] Results;
- delete Buffer;
for (unsigned I = 0, N = TemporaryFiles.size(); I != N; ++I)
TemporaryFiles[I].eraseFromDisk();
+ for (unsigned I = 0, N = TemporaryBuffers.size(); I != N; ++I)
+ delete TemporaryBuffers[I];
}
CXCodeCompleteResults *clang_codeComplete(CXIndex CIdx,
@@ -409,7 +408,6 @@ CXCodeCompleteResults *clang_codeComplete(CXIndex CIdx,
AllocatedCXCodeCompleteResults *Results = new AllocatedCXCodeCompleteResults;
Results->Results = 0;
Results->NumResults = 0;
- Results->Buffer = 0;
// FIXME: Set Results->LangOpts!
if (MemoryBuffer *F = MemoryBuffer::getFile(ResultsFile.c_str())) {
llvm::SmallVector<CXCompletionResult, 4> CompletionResults;
@@ -445,7 +443,7 @@ CXCodeCompleteResults *clang_codeComplete(CXIndex CIdx,
Results->NumResults = CompletionResults.size();
memcpy(Results->Results, CompletionResults.data(),
CompletionResults.size() * sizeof(CXCompletionResult));
- Results->Buffer = F;
+ Results->TemporaryBuffers.push_back(F);
}
LoadSerializedDiagnostics(DiagnosticsFile, num_unsaved_files, unsaved_files,
@@ -602,11 +600,15 @@ CXCodeCompleteResults *clang_codeCompleteAt(CXTranslationUnit TU,
AllocatedCXCodeCompleteResults *Results = new AllocatedCXCodeCompleteResults;
Results->Results = 0;
Results->NumResults = 0;
- Results->Buffer = 0;
// Create a code-completion consumer to capture the results.
CaptureCompletionResults Capture(*Results);
+ // Make sure that we free the temporary buffers when the
+ // code-completion constructor is freed.
+ for (unsigned I = 0, N = RemappedFiles.size(); I != N; ++I)
+ Results->TemporaryBuffers.push_back(RemappedFiles[I].second);
+
// Perform completion.
AST->CodeComplete(complete_filename, complete_line, complete_column,
RemappedFiles.data(), RemappedFiles.size(), Capture,
OpenPOWER on IntegriCloud