Skip to content

Commit b2ed372

Browse files
authored
various optimizations (#3054)
1 parent 9f9a652 commit b2ed372

2 files changed

Lines changed: 27 additions & 27 deletions

File tree

lib/astutils.cpp

Lines changed: 24 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -551,11 +551,14 @@ bool extractForLoopValues(const Token *forToken,
551551

552552
static const Token * getVariableInitExpression(const Variable * var)
553553
{
554-
if (!var || !var->declEndToken())
554+
if (!var)
555+
return nullptr;
556+
const Token *varDeclEndToken = var->declEndToken();
557+
if (!varDeclEndToken)
555558
return nullptr;
556-
if (Token::Match(var->declEndToken(), "; %varid% =", var->declarationId()))
557-
return var->declEndToken()->tokAt(2)->astOperand2();
558-
return var->declEndToken()->astOperand2();
559+
if (Token::Match(varDeclEndToken, "; %varid% =", var->declarationId()))
560+
return varDeclEndToken->tokAt(2)->astOperand2();
561+
return varDeclEndToken->astOperand2();
559562
}
560563

561564
static bool isInLoopCondition(const Token * tok)
@@ -729,13 +732,6 @@ static void followVariableExpressionError(const Token *tok1, const Token *tok2,
729732
errors->push_back(item);
730733
}
731734

732-
static void findTokenValue(const Token* const tok, std::function<bool(const ValueFlow::Value &)> pred, std::function<void(const ValueFlow::Value &)> f)
733-
{
734-
auto x = std::find_if(tok->values().begin(), tok->values().end(), pred);
735-
if (x != tok->values().end())
736-
f(*x);
737-
}
738-
739735
static bool isSameLifetime(const Token * const tok1, const Token * const tok2)
740736
{
741737
ValueFlow::Value v1 = getLifetimeObjValue(tok1);
@@ -747,18 +743,23 @@ static bool isSameLifetime(const Token * const tok1, const Token * const tok2)
747743

748744
static bool compareKnownValue(const Token * const tok1, const Token * const tok2, std::function<bool(const ValueFlow::Value&, const ValueFlow::Value&, bool)> compare)
749745
{
750-
bool result = false;
751-
bool sameLifetime = isSameLifetime(tok1, tok2);
752-
findTokenValue(tok1, std::mem_fn(&ValueFlow::Value::isKnown), [&](const ValueFlow::Value& v1) {
753-
if (v1.isNonValue() || v1.isContainerSizeValue())
754-
return;
755-
findTokenValue(tok2, std::mem_fn(&ValueFlow::Value::isKnown), [&](const ValueFlow::Value& v2) {
756-
if (v1.valueType == v2.valueType) {
757-
result = compare(v1, v2, sameLifetime);
758-
}
759-
});
760-
});
761-
return result;
746+
static const auto isKnownFn = std::mem_fn(&ValueFlow::Value::isKnown);
747+
748+
const auto v1 = std::find_if(tok1->values().begin(), tok1->values().end(), isKnownFn);
749+
if (v1 == tok1->values().end()) {
750+
return false;
751+
}
752+
if (v1->isNonValue() || v1->isContainerSizeValue())
753+
return false;
754+
const auto v2 = std::find_if(tok2->values().begin(), tok2->values().end(), isKnownFn);
755+
if (v2 == tok2->values().end()) {
756+
return false;
757+
}
758+
if (v1->valueType != v2->valueType) {
759+
return false;
760+
}
761+
const bool sameLifetime = isSameLifetime(tok1, tok2);
762+
return compare(*v1, *v2, sameLifetime);
762763
}
763764

764765
bool isEqualKnownValue(const Token * const tok1, const Token * const tok2)

lib/programmemory.cpp

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -193,13 +193,13 @@ static void fillProgramMemoryFromConditions(ProgramMemory& pm, const Token* tok,
193193
fillProgramMemoryFromConditions(pm, tok->scope(), tok, settings);
194194
}
195195

196-
static void fillProgramMemoryFromAssignments(ProgramMemory& pm, const Token* tok, const ProgramMemory& state, ProgramMemory::Map vars)
196+
static void fillProgramMemoryFromAssignments(ProgramMemory& pm, const Token* tok, const ProgramMemory& state, const ProgramMemory::Map& vars)
197197
{
198198
int indentlevel = 0;
199199
for (const Token *tok2 = tok; tok2; tok2 = tok2->previous()) {
200200
bool setvar = false;
201201
if (Token::Match(tok2, "[;{}] %var% = %var% ;")) {
202-
for (auto&& p:vars) {
202+
for (const auto& p:vars) {
203203
if (p.first != tok2->next()->varId())
204204
continue;
205205
const Token *vartok = tok2->tokAt(3);
@@ -293,15 +293,14 @@ void ProgramMemoryState::addState(const Token* tok, const ProgramMemory::Map& va
293293
{
294294
ProgramMemory pm;
295295
fillProgramMemoryFromConditions(pm, tok, nullptr);
296-
ProgramMemory local;
297296
for (const auto& p:vars) {
298297
nonneg int varid = p.first;
299298
const ValueFlow::Value &value = p.second;
300299
pm.setValue(varid, value);
301300
if (value.varId)
302301
pm.setIntValue(value.varId, value.varvalue);
303302
}
304-
local = pm;
303+
ProgramMemory local = pm;
305304
fillProgramMemoryFromAssignments(pm, tok, local, vars);
306305
replace(pm, tok);
307306
}

0 commit comments

Comments
 (0)