r243227 - [libclang] Use lambdas instead of explicit structs when storing arguments.
Benjamin Kramer
benny.kra at googlemail.com
Sat Jul 25 13:55:45 PDT 2015
Author: d0k
Date: Sat Jul 25 15:55:44 2015
New Revision: 243227
URL: http://llvm.org/viewvc/llvm-project?rev=243227&view=rev
Log:
[libclang] Use lambdas instead of explicit structs when storing arguments.
This boilerplate code was necessary to move arguments between threads in
C++98, lambdas make this much easier. No functionality change intended.
Modified:
cfe/trunk/tools/libclang/CIndex.cpp
cfe/trunk/tools/libclang/CIndexCodeCompletion.cpp
cfe/trunk/tools/libclang/CIndexer.h
cfe/trunk/tools/libclang/Indexing.cpp
Modified: cfe/trunk/tools/libclang/CIndex.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/libclang/CIndex.cpp?rev=243227&r1=243226&r2=243227&view=diff
==============================================================================
--- cfe/trunk/tools/libclang/CIndex.cpp (original)
+++ cfe/trunk/tools/libclang/CIndex.cpp Sat Jul 25 15:55:44 2015
@@ -2988,35 +2988,19 @@ clang_createTranslationUnitFromSourceFil
Options);
}
-struct ParseTranslationUnitInfo {
- CXIndex CIdx;
- const char *source_filename;
- const char *const *command_line_args;
- int num_command_line_args;
- ArrayRef<CXUnsavedFile> unsaved_files;
- unsigned options;
- CXTranslationUnit *out_TU;
- CXErrorCode &result;
-};
-static void clang_parseTranslationUnit_Impl(void *UserData) {
- const ParseTranslationUnitInfo *PTUI =
- static_cast<ParseTranslationUnitInfo *>(UserData);
- CXIndex CIdx = PTUI->CIdx;
- const char *source_filename = PTUI->source_filename;
- const char * const *command_line_args = PTUI->command_line_args;
- int num_command_line_args = PTUI->num_command_line_args;
- unsigned options = PTUI->options;
- CXTranslationUnit *out_TU = PTUI->out_TU;
-
+static CXErrorCode
+clang_parseTranslationUnit_Impl(CXIndex CIdx, const char *source_filename,
+ const char *const *command_line_args,
+ int num_command_line_args,
+ ArrayRef<CXUnsavedFile> unsaved_files,
+ unsigned options, CXTranslationUnit *out_TU) {
// Set up the initial return values.
if (out_TU)
*out_TU = nullptr;
// Check arguments.
- if (!CIdx || !out_TU) {
- PTUI->result = CXError_InvalidArguments;
- return;
- }
+ if (!CIdx || !out_TU)
+ return CXError_InvalidArguments;
CIndexer *CXXIdx = static_cast<CIndexer *>(CIdx);
@@ -3050,7 +3034,7 @@ static void clang_parseTranslationUnit_I
llvm::CrashRecoveryContextCleanupRegistrar<
std::vector<ASTUnit::RemappedFile> > RemappedCleanup(RemappedFiles.get());
- for (auto &UF : PTUI->unsaved_files) {
+ for (auto &UF : unsaved_files) {
std::unique_ptr<llvm::MemoryBuffer> MB =
llvm::MemoryBuffer::getMemBufferCopy(getContents(UF), UF.Filename);
RemappedFiles->push_back(std::make_pair(UF.Filename, MB.release()));
@@ -3109,10 +3093,8 @@ static void clang_parseTranslationUnit_I
/*UserFilesAreVolatile=*/true, ForSerialization, &ErrUnit));
// Early failures in LoadFromCommandLine may return with ErrUnit unset.
- if (!Unit && !ErrUnit) {
- PTUI->result = CXError_ASTReadError;
- return;
- }
+ if (!Unit && !ErrUnit)
+ return CXError_ASTReadError;
if (NumErrors != Diags->getClient()->getNumErrors()) {
// Make sure to check that 'Unit' is non-NULL.
@@ -3120,12 +3102,11 @@ static void clang_parseTranslationUnit_I
printDiagsToStderr(Unit ? Unit.get() : ErrUnit.get());
}
- if (isASTReadError(Unit ? Unit.get() : ErrUnit.get())) {
- PTUI->result = CXError_ASTReadError;
- } else {
- *PTUI->out_TU = MakeCXTranslationUnit(CXXIdx, Unit.release());
- PTUI->result = *PTUI->out_TU ? CXError_Success : CXError_Failure;
- }
+ if (isASTReadError(Unit ? Unit.get() : ErrUnit.get()))
+ return CXError_ASTReadError;
+
+ *out_TU = MakeCXTranslationUnit(CXXIdx, Unit.release());
+ return *out_TU ? CXError_Success : CXError_Failure;
}
CXTranslationUnit
@@ -3165,18 +3146,14 @@ enum CXErrorCode clang_parseTranslationU
return CXError_InvalidArguments;
CXErrorCode result = CXError_Failure;
- ParseTranslationUnitInfo PTUI = {
- CIdx,
- source_filename,
- command_line_args,
- num_command_line_args,
- llvm::makeArrayRef(unsaved_files, num_unsaved_files),
- options,
- out_TU,
- result};
+ auto ParseTranslationUnitImpl = [=, &result] {
+ result = clang_parseTranslationUnit_Impl(
+ CIdx, source_filename, command_line_args, num_command_line_args,
+ llvm::makeArrayRef(unsaved_files, num_unsaved_files), options, out_TU);
+ };
llvm::CrashRecoveryContext CRC;
- if (!RunSafely(CRC, clang_parseTranslationUnit_Impl, &PTUI)) {
+ if (!RunSafely(CRC, ParseTranslationUnitImpl)) {
fprintf(stderr, "libclang: crash detected during parsing: {\n");
fprintf(stderr, " 'source_filename' : '%s'\n", source_filename);
fprintf(stderr, " 'command_line_args' : [");
@@ -3199,7 +3176,7 @@ enum CXErrorCode clang_parseTranslationU
return CXError_Crashed;
} else if (getenv("LIBCLANG_RESOURCE_USAGE")) {
- if (CXTranslationUnit *TU = PTUI.out_TU)
+ if (CXTranslationUnit *TU = out_TU)
PrintLibclangResourceUsage(*TU);
}
@@ -3210,27 +3187,15 @@ unsigned clang_defaultSaveOptions(CXTran
return CXSaveTranslationUnit_None;
}
-namespace {
-
-struct SaveTranslationUnitInfo {
- CXTranslationUnit TU;
- const char *FileName;
- unsigned options;
- CXSaveError result;
-};
-
-}
-
-static void clang_saveTranslationUnit_Impl(void *UserData) {
- SaveTranslationUnitInfo *STUI =
- static_cast<SaveTranslationUnitInfo*>(UserData);
-
- CIndexer *CXXIdx = STUI->TU->CIdx;
+static CXSaveError clang_saveTranslationUnit_Impl(CXTranslationUnit TU,
+ const char *FileName,
+ unsigned options) {
+ CIndexer *CXXIdx = TU->CIdx;
if (CXXIdx->isOptEnabled(CXGlobalOpt_ThreadBackgroundPriorityForIndexing))
setThreadBackgroundPriority();
- bool hadError = cxtu::getASTUnit(STUI->TU)->Save(STUI->FileName);
- STUI->result = hadError ? CXSaveError_Unknown : CXSaveError_None;
+ bool hadError = cxtu::getASTUnit(TU)->Save(FileName);
+ return hadError ? CXSaveError_Unknown : CXSaveError_None;
}
int clang_saveTranslationUnit(CXTranslationUnit TU, const char *FileName,
@@ -3249,16 +3214,19 @@ int clang_saveTranslationUnit(CXTranslat
if (!CXXUnit->hasSema())
return CXSaveError_InvalidTU;
- SaveTranslationUnitInfo STUI = { TU, FileName, options, CXSaveError_None };
+ CXSaveError result;
+ auto SaveTranslationUnitImpl = [=, &result]() {
+ result = clang_saveTranslationUnit_Impl(TU, FileName, options);
+ };
if (!CXXUnit->getDiagnostics().hasUnrecoverableErrorOccurred() ||
getenv("LIBCLANG_NOTHREADS")) {
- clang_saveTranslationUnit_Impl(&STUI);
+ SaveTranslationUnitImpl();
if (getenv("LIBCLANG_RESOURCE_USAGE"))
PrintLibclangResourceUsage(TU);
- return STUI.result;
+ return result;
}
// We have an AST that has invalid nodes due to compiler errors.
@@ -3266,7 +3234,7 @@ int clang_saveTranslationUnit(CXTranslat
llvm::CrashRecoveryContext CRC;
- if (!RunSafely(CRC, clang_saveTranslationUnit_Impl, &STUI)) {
+ if (!RunSafely(CRC, SaveTranslationUnitImpl)) {
fprintf(stderr, "libclang: crash detected during AST saving: {\n");
fprintf(stderr, " 'filename' : '%s'\n", FileName);
fprintf(stderr, " 'options' : %d,\n", options);
@@ -3278,7 +3246,7 @@ int clang_saveTranslationUnit(CXTranslat
PrintLibclangResourceUsage(TU);
}
- return STUI.result;
+ return result;
}
void clang_disposeTranslationUnit(CXTranslationUnit CTUnit) {
@@ -3302,25 +3270,14 @@ unsigned clang_defaultReparseOptions(CXT
return CXReparse_None;
}
-struct ReparseTranslationUnitInfo {
- CXTranslationUnit TU;
- ArrayRef<CXUnsavedFile> unsaved_files;
- unsigned options;
- CXErrorCode &result;
-};
-
-static void clang_reparseTranslationUnit_Impl(void *UserData) {
- const ReparseTranslationUnitInfo *RTUI =
- static_cast<ReparseTranslationUnitInfo *>(UserData);
- CXTranslationUnit TU = RTUI->TU;
- unsigned options = RTUI->options;
- (void) options;
-
+static CXErrorCode
+clang_reparseTranslationUnit_Impl(CXTranslationUnit TU,
+ ArrayRef<CXUnsavedFile> unsaved_files,
+ unsigned options) {
// Check arguments.
if (isNotUsableTU(TU)) {
LOG_BAD_TU(TU);
- RTUI->result = CXError_InvalidArguments;
- return;
+ return CXError_InvalidArguments;
}
// Reset the associated diagnostics.
@@ -3341,7 +3298,7 @@ static void clang_reparseTranslationUnit
llvm::CrashRecoveryContextCleanupRegistrar<
std::vector<ASTUnit::RemappedFile> > RemappedCleanup(RemappedFiles.get());
- for (auto &UF : RTUI->unsaved_files) {
+ for (auto &UF : unsaved_files) {
std::unique_ptr<llvm::MemoryBuffer> MB =
llvm::MemoryBuffer::getMemBufferCopy(getContents(UF), UF.Filename);
RemappedFiles->push_back(std::make_pair(UF.Filename, MB.release()));
@@ -3349,9 +3306,10 @@ static void clang_reparseTranslationUnit
if (!CXXUnit->Reparse(CXXIdx->getPCHContainerOperations(),
*RemappedFiles.get()))
- RTUI->result = CXError_Success;
- else if (isASTReadError(CXXUnit))
- RTUI->result = CXError_ASTReadError;
+ return CXError_Success;
+ if (isASTReadError(CXXUnit))
+ return CXError_ASTReadError;
+ return CXError_Failure;
}
int clang_reparseTranslationUnit(CXTranslationUnit TU,
@@ -3365,19 +3323,20 @@ int clang_reparseTranslationUnit(CXTrans
if (num_unsaved_files && !unsaved_files)
return CXError_InvalidArguments;
- CXErrorCode result = CXError_Failure;
- ReparseTranslationUnitInfo RTUI = {
- TU, llvm::makeArrayRef(unsaved_files, num_unsaved_files), options,
- result};
+ CXErrorCode result;
+ auto ReparseTranslationUnitImpl = [=, &result]() {
+ result = clang_reparseTranslationUnit_Impl(
+ TU, llvm::makeArrayRef(unsaved_files, num_unsaved_files), options);
+ };
if (getenv("LIBCLANG_NOTHREADS")) {
- clang_reparseTranslationUnit_Impl(&RTUI);
+ ReparseTranslationUnitImpl();
return result;
}
llvm::CrashRecoveryContext CRC;
- if (!RunSafely(CRC, clang_reparseTranslationUnit_Impl, &RTUI)) {
+ if (!RunSafely(CRC, ReparseTranslationUnitImpl)) {
fprintf(stderr, "libclang: crash detected during reparsing\n");
cxtu::getASTUnit(TU)->setUnsafeToFree(true);
return CXError_Crashed;
@@ -6063,16 +6022,6 @@ MarkMacroArgTokensVisitorDelegate(CXCurs
parent);
}
-namespace {
- struct clang_annotateTokens_Data {
- CXTranslationUnit TU;
- ASTUnit *CXXUnit;
- CXToken *Tokens;
- unsigned NumTokens;
- CXCursor *Cursors;
- };
-}
-
/// \brief Used by \c annotatePreprocessorTokens.
/// \returns true if lexing was finished, false otherwise.
static bool lexNext(Lexer &Lex, Token &Tok,
@@ -6192,13 +6141,9 @@ static void annotatePreprocessorTokens(C
}
// This gets run a separate thread to avoid stack blowout.
-static void clang_annotateTokensImpl(void *UserData) {
- CXTranslationUnit TU = ((clang_annotateTokens_Data*)UserData)->TU;
- ASTUnit *CXXUnit = ((clang_annotateTokens_Data*)UserData)->CXXUnit;
- CXToken *Tokens = ((clang_annotateTokens_Data*)UserData)->Tokens;
- const unsigned NumTokens = ((clang_annotateTokens_Data*)UserData)->NumTokens;
- CXCursor *Cursors = ((clang_annotateTokens_Data*)UserData)->Cursors;
-
+static void clang_annotateTokensImpl(CXTranslationUnit TU, ASTUnit *CXXUnit,
+ CXToken *Tokens, unsigned NumTokens,
+ CXCursor *Cursors) {
CIndexer *CXXIdx = TU->CIdx;
if (CXXIdx->isOptEnabled(CXGlobalOpt_ThreadBackgroundPriorityForEditing))
setThreadBackgroundPriority();
@@ -6334,11 +6279,12 @@ void clang_annotateTokens(CXTranslationU
return;
ASTUnit::ConcurrencyCheck Check(*CXXUnit);
-
- clang_annotateTokens_Data data = { TU, CXXUnit, Tokens, NumTokens, Cursors };
+
+ auto AnnotateTokensImpl = [=]() {
+ clang_annotateTokensImpl(TU, CXXUnit, Tokens, NumTokens, Cursors);
+ };
llvm::CrashRecoveryContext CRC;
- if (!RunSafely(CRC, clang_annotateTokensImpl, &data,
- GetSafetyThreadStackSize() * 2)) {
+ if (!RunSafely(CRC, AnnotateTokensImpl, GetSafetyThreadStackSize() * 2)) {
fprintf(stderr, "libclang: crash detected while annotating tokens\n");
}
}
@@ -7187,14 +7133,13 @@ static unsigned SafetyStackThreadSize =
namespace clang {
-bool RunSafely(llvm::CrashRecoveryContext &CRC,
- void (*Fn)(void*), void *UserData,
+bool RunSafely(llvm::CrashRecoveryContext &CRC, llvm::function_ref<void()> Fn,
unsigned Size) {
if (!Size)
Size = GetSafetyThreadStackSize();
if (Size)
- return CRC.RunSafelyOnThread(Fn, UserData, Size);
- return CRC.RunSafely(Fn, UserData);
+ return CRC.RunSafelyOnThread(Fn, Size);
+ return CRC.RunSafely(Fn);
}
unsigned GetSafetyThreadStackSize() {
Modified: cfe/trunk/tools/libclang/CIndexCodeCompletion.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/libclang/CIndexCodeCompletion.cpp?rev=243227&r1=243226&r2=243227&view=diff
==============================================================================
--- cfe/trunk/tools/libclang/CIndexCodeCompletion.cpp (original)
+++ cfe/trunk/tools/libclang/CIndexCodeCompletion.cpp Sat Jul 25 15:55:44 2015
@@ -646,25 +646,12 @@ namespace {
};
}
-extern "C" {
-struct CodeCompleteAtInfo {
- CXTranslationUnit TU;
- const char *complete_filename;
- unsigned complete_line;
- unsigned complete_column;
- ArrayRef<CXUnsavedFile> unsaved_files;
- unsigned options;
- CXCodeCompleteResults *result;
-};
-static void clang_codeCompleteAt_Impl(void *UserData) {
- CodeCompleteAtInfo *CCAI = static_cast<CodeCompleteAtInfo*>(UserData);
- CXTranslationUnit TU = CCAI->TU;
- const char *complete_filename = CCAI->complete_filename;
- unsigned complete_line = CCAI->complete_line;
- unsigned complete_column = CCAI->complete_column;
- unsigned options = CCAI->options;
+static CXCodeCompleteResults *
+clang_codeCompleteAt_Impl(CXTranslationUnit TU, const char *complete_filename,
+ unsigned complete_line, unsigned complete_column,
+ ArrayRef<CXUnsavedFile> unsaved_files,
+ unsigned options) {
bool IncludeBriefComments = options & CXCodeComplete_IncludeBriefComments;
- CCAI->result = nullptr;
#ifdef UDP_CODE_COMPLETION_LOGGER
#ifdef UDP_CODE_COMPLETION_LOGGER_PORT
@@ -676,12 +663,12 @@ static void clang_codeCompleteAt_Impl(vo
if (cxtu::isNotUsableTU(TU)) {
LOG_BAD_TU(TU);
- return;
+ return nullptr;
}
ASTUnit *AST = cxtu::getASTUnit(TU);
if (!AST)
- return;
+ return nullptr;
CIndexer *CXXIdx = TU->CIdx;
if (CXXIdx->isOptEnabled(CXGlobalOpt_ThreadBackgroundPriorityForEditing))
@@ -692,7 +679,7 @@ static void clang_codeCompleteAt_Impl(vo
// Perform the remapping of source files.
SmallVector<ASTUnit::RemappedFile, 4> RemappedFiles;
- for (auto &UF : CCAI->unsaved_files) {
+ for (auto &UF : unsaved_files) {
std::unique_ptr<llvm::MemoryBuffer> MB =
llvm::MemoryBuffer::getMemBufferCopy(getContents(UF), UF.Filename);
RemappedFiles.push_back(std::make_pair(UF.Filename, MB.release()));
@@ -804,8 +791,10 @@ static void clang_codeCompleteAt_Impl(vo
}
#endif
#endif
- CCAI->result = Results;
+ return Results;
}
+
+extern "C" {
CXCodeCompleteResults *clang_codeCompleteAt(CXTranslationUnit TU,
const char *complete_filename,
unsigned complete_line,
@@ -821,25 +810,28 @@ CXCodeCompleteResults *clang_codeComplet
if (num_unsaved_files && !unsaved_files)
return nullptr;
- CodeCompleteAtInfo CCAI = {TU, complete_filename, complete_line,
- complete_column, llvm::makeArrayRef(unsaved_files, num_unsaved_files),
- options, nullptr};
+ CXCodeCompleteResults *result;
+ auto CodeCompleteAtImpl = [=, &result]() {
+ result = clang_codeCompleteAt_Impl(
+ TU, complete_filename, complete_line, complete_column,
+ llvm::makeArrayRef(unsaved_files, num_unsaved_files), options);
+ };
if (getenv("LIBCLANG_NOTHREADS")) {
- clang_codeCompleteAt_Impl(&CCAI);
- return CCAI.result;
+ CodeCompleteAtImpl();
+ return result;
}
llvm::CrashRecoveryContext CRC;
- if (!RunSafely(CRC, clang_codeCompleteAt_Impl, &CCAI)) {
+ if (!RunSafely(CRC, CodeCompleteAtImpl)) {
fprintf(stderr, "libclang: crash detected in code completion\n");
cxtu::getASTUnit(TU)->setUnsafeToFree(true);
return nullptr;
} else if (getenv("LIBCLANG_RESOURCE_USAGE"))
PrintLibclangResourceUsage(TU);
- return CCAI.result;
+ return result;
}
unsigned clang_defaultCodeCompleteOptions(void) {
Modified: cfe/trunk/tools/libclang/CIndexer.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/libclang/CIndexer.h?rev=243227&r1=243226&r2=243227&view=diff
==============================================================================
--- cfe/trunk/tools/libclang/CIndexer.h (original)
+++ cfe/trunk/tools/libclang/CIndexer.h Sat Jul 25 15:55:44 2015
@@ -85,8 +85,8 @@ public:
/// threads when possible.
///
/// \return False if a crash was detected.
- bool RunSafely(llvm::CrashRecoveryContext &CRC,
- void (*Fn)(void*), void *UserData, unsigned Size = 0);
+ bool RunSafely(llvm::CrashRecoveryContext &CRC, llvm::function_ref<void()> Fn,
+ unsigned Size = 0);
/// \brief Set the thread priority to background.
/// FIXME: Move to llvm/Support.
Modified: cfe/trunk/tools/libclang/Indexing.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/libclang/Indexing.cpp?rev=243227&r1=243226&r2=243227&view=diff
==============================================================================
--- cfe/trunk/tools/libclang/Indexing.cpp (original)
+++ cfe/trunk/tools/libclang/Indexing.cpp Sat Jul 25 15:55:44 2015
@@ -462,48 +462,24 @@ struct IndexSessionData {
: CIdx(cIdx), SkipBodyData(new SessionSkipBodyData) {}
};
-struct IndexSourceFileInfo {
- CXIndexAction idxAction;
- CXClientData client_data;
- IndexerCallbacks *index_callbacks;
- unsigned index_callbacks_size;
- unsigned index_options;
- const char *source_filename;
- const char *const *command_line_args;
- int num_command_line_args;
- ArrayRef<CXUnsavedFile> unsaved_files;
- CXTranslationUnit *out_TU;
- unsigned TU_options;
- CXErrorCode &result;
-};
-
} // anonymous namespace
-static void clang_indexSourceFile_Impl(void *UserData) {
- const IndexSourceFileInfo *ITUI =
- static_cast<IndexSourceFileInfo *>(UserData);
- CXIndexAction cxIdxAction = ITUI->idxAction;
- CXClientData client_data = ITUI->client_data;
- IndexerCallbacks *client_index_callbacks = ITUI->index_callbacks;
- unsigned index_callbacks_size = ITUI->index_callbacks_size;
- unsigned index_options = ITUI->index_options;
- const char *source_filename = ITUI->source_filename;
- const char * const *command_line_args = ITUI->command_line_args;
- int num_command_line_args = ITUI->num_command_line_args;
- CXTranslationUnit *out_TU = ITUI->out_TU;
- unsigned TU_options = ITUI->TU_options;
-
+static CXErrorCode clang_indexSourceFile_Impl(
+ CXIndexAction cxIdxAction, CXClientData client_data,
+ IndexerCallbacks *client_index_callbacks, unsigned index_callbacks_size,
+ unsigned index_options, const char *source_filename,
+ const char *const *command_line_args, int num_command_line_args,
+ ArrayRef<CXUnsavedFile> unsaved_files, CXTranslationUnit *out_TU,
+ unsigned TU_options) {
if (out_TU)
*out_TU = nullptr;
bool requestedToGetTU = (out_TU != nullptr);
if (!cxIdxAction) {
- ITUI->result = CXError_InvalidArguments;
- return;
+ return CXError_InvalidArguments;
}
if (!client_index_callbacks || index_callbacks_size == 0) {
- ITUI->result = CXError_InvalidArguments;
- return;
+ return CXError_InvalidArguments;
}
IndexerCallbacks CB;
@@ -557,7 +533,7 @@ static void clang_indexSourceFile_Impl(v
CInvok(createInvocationFromCommandLine(*Args, Diags));
if (!CInvok)
- return;
+ return CXError_Failure;
// Recover resources if we crash before exiting this function.
llvm::CrashRecoveryContextCleanupRegistrar<CompilerInvocation,
@@ -565,7 +541,7 @@ static void clang_indexSourceFile_Impl(v
CInvokCleanup(CInvok.get());
if (CInvok->getFrontendOpts().Inputs.empty())
- return;
+ return CXError_Failure;
typedef SmallVector<std::unique_ptr<llvm::MemoryBuffer>, 8> MemBufferOwner;
std::unique_ptr<MemBufferOwner> BufOwner(new MemBufferOwner);
@@ -574,7 +550,7 @@ static void clang_indexSourceFile_Impl(v
llvm::CrashRecoveryContextCleanupRegistrar<MemBufferOwner> BufOwnerCleanup(
BufOwner.get());
- for (auto &UF : ITUI->unsaved_files) {
+ for (auto &UF : unsaved_files) {
std::unique_ptr<llvm::MemoryBuffer> MB =
llvm::MemoryBuffer::getMemBufferCopy(getContents(UF), UF.Filename);
CInvok->getPreprocessorOpts().addRemappedFile(UF.Filename, MB.get());
@@ -592,10 +568,8 @@ static void clang_indexSourceFile_Impl(v
ASTUnit *Unit = ASTUnit::create(CInvok.get(), Diags, CaptureDiagnostics,
/*UserFilesAreVolatile=*/true);
- if (!Unit) {
- ITUI->result = CXError_InvalidArguments;
- return;
- }
+ if (!Unit)
+ return CXError_InvalidArguments;
std::unique_ptr<CXTUOwner> CXTU(
new CXTUOwner(MakeCXTranslationUnit(CXXIdx, Unit)));
@@ -653,38 +627,22 @@ static void clang_indexSourceFile_Impl(v
if (DiagTrap.hasErrorOccurred() && CXXIdx->getDisplayDiagnostics())
printDiagsToStderr(Unit);
- if (isASTReadError(Unit)) {
- ITUI->result = CXError_ASTReadError;
- return;
- }
+ if (isASTReadError(Unit))
+ return CXError_ASTReadError;
if (!Success)
- return;
+ return CXError_Failure;
if (out_TU)
*out_TU = CXTU->takeTU();
- ITUI->result = CXError_Success;
+ return CXError_Success;
}
//===----------------------------------------------------------------------===//
// clang_indexTranslationUnit Implementation
//===----------------------------------------------------------------------===//
-namespace {
-
-struct IndexTranslationUnitInfo {
- CXIndexAction idxAction;
- CXClientData client_data;
- IndexerCallbacks *index_callbacks;
- unsigned index_callbacks_size;
- unsigned index_options;
- CXTranslationUnit TU;
- int result;
-};
-
-} // anonymous namespace
-
static void indexPreprocessingRecord(ASTUnit &Unit, IndexingContext &IdxCtx) {
Preprocessor &PP = Unit.getPreprocessor();
if (!PP.getPreprocessingRecord())
@@ -728,27 +686,17 @@ static void indexDiagnostics(CXTranslati
IdxCtx.handleDiagnosticSet(DiagSet);
}
-static void clang_indexTranslationUnit_Impl(void *UserData) {
- IndexTranslationUnitInfo *ITUI =
- static_cast<IndexTranslationUnitInfo*>(UserData);
- CXTranslationUnit TU = ITUI->TU;
- CXClientData client_data = ITUI->client_data;
- IndexerCallbacks *client_index_callbacks = ITUI->index_callbacks;
- unsigned index_callbacks_size = ITUI->index_callbacks_size;
- unsigned index_options = ITUI->index_options;
-
- // Set up the initial return value.
- ITUI->result = CXError_Failure;
-
+static CXErrorCode clang_indexTranslationUnit_Impl(
+ CXIndexAction idxAction, CXClientData client_data,
+ IndexerCallbacks *client_index_callbacks, unsigned index_callbacks_size,
+ unsigned index_options, CXTranslationUnit TU) {
// Check arguments.
if (isNotUsableTU(TU)) {
LOG_BAD_TU(TU);
- ITUI->result = CXError_InvalidArguments;
- return;
+ return CXError_InvalidArguments;
}
if (!client_index_callbacks || index_callbacks_size == 0) {
- ITUI->result = CXError_InvalidArguments;
- return;
+ return CXError_InvalidArguments;
}
CIndexer *CXXIdx = TU->CIdx;
@@ -777,7 +725,7 @@ static void clang_indexTranslationUnit_I
ASTUnit *Unit = cxtu::getASTUnit(TU);
if (!Unit)
- return;
+ return CXError_Failure;
ASTUnit::ConcurrencyCheck Check(*Unit);
@@ -797,7 +745,7 @@ static void clang_indexTranslationUnit_I
indexTranslationUnit(*Unit, *IndexCtx);
indexDiagnostics(TU, *IndexCtx);
- ITUI->result = CXError_Success;
+ return CXError_Success;
}
//===----------------------------------------------------------------------===//
@@ -969,28 +917,23 @@ int clang_indexSourceFile(CXIndexAction
return CXError_InvalidArguments;
CXErrorCode result = CXError_Failure;
- IndexSourceFileInfo ITUI = {
- idxAction,
- client_data,
- index_callbacks,
- index_callbacks_size,
- index_options,
- source_filename,
- command_line_args,
- num_command_line_args,
- llvm::makeArrayRef(unsaved_files, num_unsaved_files),
- out_TU,
- TU_options,
- result};
+ auto IndexSourceFileImpl = [=, &result]() {
+ result = clang_indexSourceFile_Impl(
+ idxAction, client_data, index_callbacks, index_callbacks_size,
+ index_options, source_filename, command_line_args,
+ num_command_line_args,
+ llvm::makeArrayRef(unsaved_files, num_unsaved_files), out_TU,
+ TU_options);
+ };
if (getenv("LIBCLANG_NOTHREADS")) {
- clang_indexSourceFile_Impl(&ITUI);
+ IndexSourceFileImpl();
return result;
}
llvm::CrashRecoveryContext CRC;
- if (!RunSafely(CRC, clang_indexSourceFile_Impl, &ITUI)) {
+ if (!RunSafely(CRC, IndexSourceFileImpl)) {
fprintf(stderr, "libclang: crash detected during indexing source file: {\n");
fprintf(stderr, " 'source_filename' : '%s'\n", source_filename);
fprintf(stderr, " 'command_line_args' : [");
@@ -1030,24 +973,27 @@ int clang_indexTranslationUnit(CXIndexAc
*Log << TU;
}
- IndexTranslationUnitInfo ITUI = { idxAction, client_data, index_callbacks,
- index_callbacks_size, index_options, TU,
- 0 };
+ CXErrorCode result;
+ auto IndexTranslationUnitImpl = [=, &result]() {
+ result = clang_indexTranslationUnit_Impl(
+ idxAction, client_data, index_callbacks, index_callbacks_size,
+ index_options, TU);
+ };
if (getenv("LIBCLANG_NOTHREADS")) {
- clang_indexTranslationUnit_Impl(&ITUI);
- return ITUI.result;
+ IndexTranslationUnitImpl();
+ return result;
}
llvm::CrashRecoveryContext CRC;
- if (!RunSafely(CRC, clang_indexTranslationUnit_Impl, &ITUI)) {
+ if (!RunSafely(CRC, IndexTranslationUnitImpl)) {
fprintf(stderr, "libclang: crash detected during indexing TU\n");
return 1;
}
- return ITUI.result;
+ return result;
}
void clang_indexLoc_getFileLocation(CXIdxLoc location,
More information about the cfe-commits
mailing list