From 399bfbd6399da3df7ef0312bb9f87752f0946921 Mon Sep 17 00:00:00 2001 From: firewave Date: Thu, 6 Mar 2025 02:19:37 +0100 Subject: [PATCH] only create `Token::mMacroName` if necessary --- lib/token.cpp | 4 +++- lib/token.h | 11 +++++++---- lib/tokenize.cpp | 6 ++++-- lib/tokenlist.cpp | 9 ++++++--- 4 files changed, 20 insertions(+), 10 deletions(-) diff --git a/lib/token.cpp b/lib/token.cpp index de93e1b379c..8f6ce11be22 100644 --- a/lib/token.cpp +++ b/lib/token.cpp @@ -1048,7 +1048,8 @@ Token* Token::insertToken(const std::string& tokenStr, const std::string& origin newToken->str(tokenStr); if (!originalNameStr.empty()) newToken->originalName(originalNameStr); - newToken->setMacroName(macroNameStr); + if (!macroNameStr.empty()) + newToken->setMacroName(macroNameStr); if (newToken != this) { newToken->mImpl->mLineNumber = mImpl->mLineNumber; @@ -2599,6 +2600,7 @@ const ValueFlow::Value* Token::getContainerSizeValue(const MathLib::bigint val) TokenImpl::~TokenImpl() { + delete mMacroName; delete mOriginalName; delete mValueType; delete mValues; diff --git a/lib/token.h b/lib/token.h index 4ffa5890b29..f0079a00d5d 100644 --- a/lib/token.h +++ b/lib/token.h @@ -101,7 +101,7 @@ struct TokenImpl { std::string* mOriginalName{}; // If this token came from a macro replacement list, this is the name of that macro - std::string mMacroName; + std::string* mMacroName{}; // ValueType ValueType* mValueType{}; @@ -480,7 +480,7 @@ class CPPCHECKLIB Token { setFlag(fIsStandardType, b); } bool isExpandedMacro() const { - return !mImpl->mMacroName.empty(); + return !!mImpl->mMacroName; } bool isCast() const { return getFlag(fIsCast); @@ -805,10 +805,13 @@ class CPPCHECKLIB Token { } const std::string& getMacroName() const { - return mImpl->mMacroName; + return mImpl->mMacroName ? *mImpl->mMacroName : mEmptyString; } void setMacroName(std::string name) { - mImpl->mMacroName = std::move(name); + if (!mImpl->mMacroName) + mImpl->mMacroName = new std::string(std::move(name)); + else + *mImpl->mMacroName = std::move(name); } template diff --git a/lib/tokenize.cpp b/lib/tokenize.cpp index 2529192bd2e..5a1b8df30e1 100644 --- a/lib/tokenize.cpp +++ b/lib/tokenize.cpp @@ -781,7 +781,8 @@ namespace { if (pointerType) { tok->insertToken("const"); tok->next()->column(tok->column()); - tok->next()->setMacroName(tok->previous()->getMacroName()); + if (!tok->previous()->getMacroName().empty()) + tok->next()->setMacroName(tok->previous()->getMacroName()); tok->deletePrevious(); } } @@ -7319,7 +7320,8 @@ void Tokenizer::simplifyVarDecl(Token * tokBegin, const Token * const tokEnd, co endDecl = endDecl->next(); endDecl->next()->isSplittedVarDeclEq(true); endDecl->insertToken(varName->str()); - endDecl->next()->setMacroName(varName->getMacroName()); + if (!varName->getMacroName().empty()) + endDecl->next()->setMacroName(varName->getMacroName()); continue; } //non-VLA case diff --git a/lib/tokenlist.cpp b/lib/tokenlist.cpp index 60ed63e9f23..399d0e5c4d7 100644 --- a/lib/tokenlist.cpp +++ b/lib/tokenlist.cpp @@ -255,7 +255,8 @@ void TokenList::addtoken(const Token *tok) mTokensFrontBack.back->str(tok->str()); if (!tok->originalName().empty()) mTokensFrontBack.back->originalName(tok->originalName()); - mTokensFrontBack.back->setMacroName(tok->getMacroName()); + if (!tok->getMacroName().empty()) + mTokensFrontBack.back->setMacroName(tok->getMacroName()); } mTokensFrontBack.back->flags(tok->flags()); @@ -332,7 +333,8 @@ void TokenList::insertTokens(Token *dest, const Token *src, nonneg int n) dest->varId(src->varId()); dest->tokType(src->tokType()); dest->flags(src->flags()); - dest->setMacroName(src->getMacroName()); + if (!src->getMacroName().empty()) + dest->setMacroName(src->getMacroName()); src = src->next(); --n; } @@ -415,7 +417,8 @@ void TokenList::createTokens(simplecpp::TokenList&& tokenList) mTokensFrontBack.back->fileIndex(tok->location.fileIndex); mTokensFrontBack.back->linenr(tok->location.line); mTokensFrontBack.back->column(tok->location.col); - mTokensFrontBack.back->setMacroName(tok->macro); + if (!tok->macro.empty()) + mTokensFrontBack.back->setMacroName(tok->macro); tok = tok->next; if (tok)