From d3b231214df45a0a42d43f83def4e97daa280a83 Mon Sep 17 00:00:00 2001 From: rebnridgway Date: Sat, 2 Jun 2018 13:49:14 +0200 Subject: [PATCH] TemplateSimplifier optimisation. measured time improvement for cryptopp/test.cpp is ~8.4s => ~8.35s --- lib/templatesimplifier.cpp | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/lib/templatesimplifier.cpp b/lib/templatesimplifier.cpp index 9e75f5c3f..22c9c7ab0 100644 --- a/lib/templatesimplifier.cpp +++ b/lib/templatesimplifier.cpp @@ -492,7 +492,10 @@ std::list TemplateSimplifier::getTemplateDecla std::list scopeInfo; std::list declarations; for (Token *tok = tokens; tok; tok = tok->next()) { - setScopeInfo(tok, &scopeInfo); + if (Token::Match(tok, "}|namespace|class|struct")) { + setScopeInfo(tok, &scopeInfo); + continue; + } if (!Token::simpleMatch(tok, "template <")) continue; // Some syntax checks, see #6865 @@ -530,7 +533,10 @@ std::list TemplateSimplifier::getTemplateInsta std::list scopeList; for (Token *tok = tokens; tok; tok = tok->next()) { - setScopeInfo(tok, &scopeList); + if (Token::Match(tok, "}|namespace|class|struct")) { + setScopeInfo(tok, &scopeList); + continue; + } // template definition.. skip it if (Token::simpleMatch(tok, "template <")) { tok = tok->next()->findClosingBracket(); @@ -949,7 +955,10 @@ void TemplateSimplifier::expandTemplate( const Token *endOfTemplateDefinition = nullptr; const Token * const templateDeclarationNameToken = templateDeclarationToken->tokAt(getTemplateNamePosition(templateDeclarationToken)); for (const Token *tok3 = tokenlist.front(); tok3; tok3 = tok3 ? tok3->next() : nullptr) { - setScopeInfo(const_cast(tok3), &scopeInfo); + if (Token::Match(tok3, "}|namespace|class|struct")) { + setScopeInfo(tok3, &scopeInfo); + continue; + } if (inTemplateDefinition) { if (!endOfTemplateDefinition && tok3->str() == "{") endOfTemplateDefinition = tok3->link(); @@ -1640,7 +1649,10 @@ void TemplateSimplifier::replaceTemplateUsage(Token * const instantiationToken, std::list scopeInfo; std::list< std::pair > removeTokens; for (Token *nameTok = instantiationToken; nameTok; nameTok = nameTok->next()) { - setScopeInfo(nameTok, &scopeInfo); + if (Token::Match(nameTok, "}|namespace|class|struct")) { + setScopeInfo(nameTok, &scopeInfo); + continue; + } if (!Token::Match(nameTok, "%name% <")) continue; if (!matchTemplateParameters(nameTok, typeStringsUsedInTemplateInstantiation))