Skip to content

Commit 662ada6

Browse files
authored
Refactor: Use a template instead of std::function in forward analyzer to help improve debugging (#3551)
1 parent 035c70c commit 662ada6

1 file changed

Lines changed: 9 additions & 9 deletions

File tree

lib/forwardanalyzer.cpp

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -93,8 +93,8 @@ struct ForwardTraversal {
9393
return evalCond(tok, ctx).second;
9494
}
9595

96-
template<class T, REQUIRES("T must be a Token class", std::is_convertible<T*, const Token*> )>
97-
Progress traverseTok(T* tok, std::function<Progress(T*)> f, bool traverseUnknown, T** out = nullptr) {
96+
template<class T, class F, REQUIRES("T must be a Token class", std::is_convertible<T*, const Token*> )>
97+
Progress traverseTok(T* tok, F f, bool traverseUnknown, T** out = nullptr) {
9898
if (Token::Match(tok, "asm|goto|setjmp|longjmp"))
9999
return Break(Analyzer::Terminate::Bail);
100100
else if (Token::simpleMatch(tok, "continue")) {
@@ -134,8 +134,8 @@ struct ForwardTraversal {
134134
return Progress::Continue;
135135
}
136136

137-
template<class T, REQUIRES("T must be a Token class", std::is_convertible<T*, const Token*> )>
138-
Progress traverseRecursive(T* tok, std::function<Progress(T*)> f, bool traverseUnknown, unsigned int recursion=0) {
137+
template<class T, class F, REQUIRES("T must be a Token class", std::is_convertible<T*, const Token*> )>
138+
Progress traverseRecursive(T* tok, F f, bool traverseUnknown, unsigned int recursion=0) {
139139
if (!tok)
140140
return Progress::Continue;
141141
if (recursion > 10000)
@@ -206,22 +206,22 @@ struct ForwardTraversal {
206206
}
207207

208208
Progress updateTok(Token* tok, Token** out = nullptr) {
209-
std::function<Progress(Token*)> f = [this](Token* tok2) {
209+
auto f = [this](Token* tok2) {
210210
return update(tok2);
211211
};
212212
return traverseTok(tok, f, false, out);
213213
}
214214

215215
Progress updateRecursive(Token* tok) {
216216
forked = false;
217-
std::function<Progress(Token*)> f = [this](Token* tok2) {
217+
auto f = [this](Token* tok2) {
218218
return update(tok2);
219219
};
220220
return traverseRecursive(tok, f, false);
221221
}
222222

223-
template<class T>
224-
T* findRange(T* start, const Token* end, std::function<bool(Analyzer::Action)> pred) {
223+
template<class T, class F>
224+
T* findRange(T* start, const Token* end, F pred) {
225225
for (T* tok = start; tok && tok != end; tok = tok->next()) {
226226
Analyzer::Action action = analyzer->analyze(tok, Analyzer::Direction::Forward);
227227
if (pred(action))
@@ -232,7 +232,7 @@ struct ForwardTraversal {
232232

233233
Analyzer::Action analyzeRecursive(const Token* start) {
234234
Analyzer::Action result = Analyzer::Action::None;
235-
std::function<Progress(const Token*)> f = [&](const Token* tok) {
235+
auto f = [&](const Token* tok) {
236236
result = analyzer->analyze(tok, Analyzer::Direction::Forward);
237237
if (result.isModified() || result.isInconclusive())
238238
return Break();

0 commit comments

Comments
 (0)