From: Benjamin Kramer Date: Sat, 25 Jul 2015 20:55:44 +0000 (+0000) Subject: [libclang] Use lambdas instead of explicit structs when storing arguments. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=cd794195b9e8535a824ad5e2fdb05e7ab01fd210;p=clang [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. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@243227 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/tools/libclang/CIndex.cpp b/tools/libclang/CIndex.cpp index 3579fc77c7..f6710a096e 100644 --- a/tools/libclang/CIndex.cpp +++ b/tools/libclang/CIndex.cpp @@ -2988,35 +2988,19 @@ clang_createTranslationUnitFromSourceFile(CXIndex CIdx, Options); } -struct ParseTranslationUnitInfo { - CXIndex CIdx; - const char *source_filename; - const char *const *command_line_args; - int num_command_line_args; - ArrayRef unsaved_files; - unsigned options; - CXTranslationUnit *out_TU; - CXErrorCode &result; -}; -static void clang_parseTranslationUnit_Impl(void *UserData) { - const ParseTranslationUnitInfo *PTUI = - static_cast(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 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(CIdx); @@ -3050,7 +3034,7 @@ static void clang_parseTranslationUnit_Impl(void *UserData) { llvm::CrashRecoveryContextCleanupRegistrar< std::vector > RemappedCleanup(RemappedFiles.get()); - for (auto &UF : PTUI->unsaved_files) { + for (auto &UF : unsaved_files) { std::unique_ptr 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_Impl(void *UserData) { /*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_Impl(void *UserData) { 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_parseTranslationUnit2( 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_parseTranslationUnit2( 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(CXTranslationUnit TU) { 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(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(CXTranslationUnit TU, const char *FileName, 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(CXTranslationUnit TU, const char *FileName, 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(CXTranslationUnit TU, const char *FileName, PrintLibclangResourceUsage(TU); } - return STUI.result; + return result; } void clang_disposeTranslationUnit(CXTranslationUnit CTUnit) { @@ -3302,25 +3270,14 @@ unsigned clang_defaultReparseOptions(CXTranslationUnit TU) { return CXReparse_None; } -struct ReparseTranslationUnitInfo { - CXTranslationUnit TU; - ArrayRef unsaved_files; - unsigned options; - CXErrorCode &result; -}; - -static void clang_reparseTranslationUnit_Impl(void *UserData) { - const ReparseTranslationUnitInfo *RTUI = - static_cast(UserData); - CXTranslationUnit TU = RTUI->TU; - unsigned options = RTUI->options; - (void) options; - +static CXErrorCode +clang_reparseTranslationUnit_Impl(CXTranslationUnit TU, + ArrayRef 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_Impl(void *UserData) { llvm::CrashRecoveryContextCleanupRegistrar< std::vector > RemappedCleanup(RemappedFiles.get()); - for (auto &UF : RTUI->unsaved_files) { + for (auto &UF : unsaved_files) { std::unique_ptr 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_Impl(void *UserData) { 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(CXTranslationUnit TU, 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(CXCursor cursor, CXCursor parent, 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(CXTranslationUnit TU, } // 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(CXTranslationUnit TU, 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 = 8 << 20; namespace clang { -bool RunSafely(llvm::CrashRecoveryContext &CRC, - void (*Fn)(void*), void *UserData, +bool RunSafely(llvm::CrashRecoveryContext &CRC, llvm::function_ref 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() { diff --git a/tools/libclang/CIndexCodeCompletion.cpp b/tools/libclang/CIndexCodeCompletion.cpp index 9609a693ab..344ed27021 100644 --- a/tools/libclang/CIndexCodeCompletion.cpp +++ b/tools/libclang/CIndexCodeCompletion.cpp @@ -646,25 +646,12 @@ namespace { }; } -extern "C" { -struct CodeCompleteAtInfo { - CXTranslationUnit TU; - const char *complete_filename; - unsigned complete_line; - unsigned complete_column; - ArrayRef unsaved_files; - unsigned options; - CXCodeCompleteResults *result; -}; -static void clang_codeCompleteAt_Impl(void *UserData) { - CodeCompleteAtInfo *CCAI = static_cast(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 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(void *UserData) { 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(void *UserData) { // Perform the remapping of source files. SmallVector RemappedFiles; - for (auto &UF : CCAI->unsaved_files) { + for (auto &UF : unsaved_files) { std::unique_ptr 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(void *UserData) { } #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_codeCompleteAt(CXTranslationUnit TU, 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) { diff --git a/tools/libclang/CIndexer.h b/tools/libclang/CIndexer.h index bf55301d61..94c27a0560 100644 --- a/tools/libclang/CIndexer.h +++ b/tools/libclang/CIndexer.h @@ -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 Fn, + unsigned Size = 0); /// \brief Set the thread priority to background. /// FIXME: Move to llvm/Support. diff --git a/tools/libclang/Indexing.cpp b/tools/libclang/Indexing.cpp index e35640029e..8a0498497e 100644 --- a/tools/libclang/Indexing.cpp +++ b/tools/libclang/Indexing.cpp @@ -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 unsaved_files; - CXTranslationUnit *out_TU; - unsigned TU_options; - CXErrorCode &result; -}; - } // anonymous namespace -static void clang_indexSourceFile_Impl(void *UserData) { - const IndexSourceFileInfo *ITUI = - static_cast(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 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(void *UserData) { CInvok(createInvocationFromCommandLine(*Args, Diags)); if (!CInvok) - return; + return CXError_Failure; // Recover resources if we crash before exiting this function. llvm::CrashRecoveryContextCleanupRegistrargetFrontendOpts().Inputs.empty()) - return; + return CXError_Failure; typedef SmallVector, 8> MemBufferOwner; std::unique_ptr BufOwner(new MemBufferOwner); @@ -574,7 +550,7 @@ static void clang_indexSourceFile_Impl(void *UserData) { llvm::CrashRecoveryContextCleanupRegistrar BufOwnerCleanup( BufOwner.get()); - for (auto &UF : ITUI->unsaved_files) { + for (auto &UF : unsaved_files) { std::unique_ptr MB = llvm::MemoryBuffer::getMemBufferCopy(getContents(UF), UF.Filename); CInvok->getPreprocessorOpts().addRemappedFile(UF.Filename, MB.get()); @@ -592,10 +568,8 @@ static void clang_indexSourceFile_Impl(void *UserData) { 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 CXTU( new CXTUOwner(MakeCXTranslationUnit(CXXIdx, Unit))); @@ -653,38 +627,22 @@ static void clang_indexSourceFile_Impl(void *UserData) { 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(CXTranslationUnit TU, IndexingContext &IdxCtx) { IdxCtx.handleDiagnosticSet(DiagSet); } -static void clang_indexTranslationUnit_Impl(void *UserData) { - IndexTranslationUnitInfo *ITUI = - static_cast(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_Impl(void *UserData) { ASTUnit *Unit = cxtu::getASTUnit(TU); if (!Unit) - return; + return CXError_Failure; ASTUnit::ConcurrencyCheck Check(*Unit); @@ -797,7 +745,7 @@ static void clang_indexTranslationUnit_Impl(void *UserData) { indexTranslationUnit(*Unit, *IndexCtx); indexDiagnostics(TU, *IndexCtx); - ITUI->result = CXError_Success; + return CXError_Success; } //===----------------------------------------------------------------------===// @@ -969,28 +917,23 @@ int clang_indexSourceFile(CXIndexAction idxAction, 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(CXIndexAction idxAction, *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,