Skip to content

Commit

Permalink
programmemory.cpp: avoid duplicated evaluation in `ProgramMemoryState…
Browse files Browse the repository at this point in the history
…::removeModifiedVars()`
  • Loading branch information
firewave committed Jul 21, 2024
1 parent 9989419 commit fb64f4e
Showing 1 changed file with 14 additions and 9 deletions.
23 changes: 14 additions & 9 deletions lib/programmemory.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -202,24 +202,26 @@ void ProgramMemory::insert(const ProgramMemory &pm)

static ValueFlow::Value execute(const Token* expr, ProgramMemory& pm, const Settings& settings);

static bool evaluateCondition(MathLib::bigint r, const Token* condition, ProgramMemory& pm, const Settings& settings)
static bool evaluateCondition(const Token* condition, ProgramMemory pm, const Settings& settings, MathLib::bigint& result)
{
if (!condition)
return false;
MathLib::bigint result = 0;
result = 0;
bool error = false;
execute(condition, pm, &result, &error, settings);
return !error && result == r;
return !error;
}

bool conditionIsFalse(const Token* condition, ProgramMemory pm, const Settings& settings)
{
return evaluateCondition(0, condition, pm, settings);
MathLib::bigint result;
return evaluateCondition(condition, std::move(pm), settings, result) && result == 0;
}

bool conditionIsTrue(const Token* condition, ProgramMemory pm, const Settings& settings)
{
return evaluateCondition(1, condition, pm, settings);
MathLib::bigint result;
return evaluateCondition(condition, std::move(pm), settings, result) && result == 1;
}

static bool frontIs(const std::vector<MathLib::bigint>& v, bool i)
Expand Down Expand Up @@ -505,10 +507,13 @@ void ProgramMemoryState::removeModifiedVars(const Token* tok)
{
const ProgramMemory& pm = state;
auto eval = [&](const Token* cond) -> std::vector<MathLib::bigint> {
if (conditionIsTrue(cond, pm, *settings))
return {1};
if (conditionIsFalse(cond, pm, *settings))
return {0};
MathLib::bigint result;
if (evaluateCondition(cond, pm, *settings, result)) {
if (result == 1)
return {1};
if (result == 0)
return {0};
}
return {};
};
state.erase_if([&](const ExprIdToken& e) {
Expand Down

0 comments on commit fb64f4e

Please sign in to comment.