Skip to content

Commit

Permalink
1)Implement another declaration of 'Token::eraseTokens' with paramete…
Browse files Browse the repository at this point in the history
…rs: the starting token and the number of times needed to call 'deleteNext'.

2)Use the overloaded 'eraseTokens' where needed instead of using consecutively 'deleteNext'.
3)Tokenizer: general optimizations about the deletion of some tokens.
4)Run astyle.
  • Loading branch information
Edoardo Prezioso committed Dec 7, 2011
1 parent b922443 commit 612b3c5
Show file tree
Hide file tree
Showing 5 changed files with 121 additions and 253 deletions.
131 changes: 37 additions & 94 deletions lib/checkmemoryleak.cpp
Expand Up @@ -1551,20 +1551,16 @@ void CheckMemoryLeakInFunction::simplifycode(Token *tok)
--innerIndentlevel;
}
while (innerIndentlevel == 0 && Token::Match(tok3, "[{};] if|ifv|else { continue ; }")) {
Token::eraseTokens(tok3, tok3->tokAt(6));
Token::eraseTokens(tok3, 5);
if (Token::simpleMatch(tok3->next(), "else"))
tok3->deleteNext();
}
}

if (Token::simpleMatch(tok2, "while1 { if { dealloc ; return ; } }")) {
tok2->str(";");
tok2->deleteNext();
tok2->deleteNext();
tok2->deleteNext();
Token *t = tok2->tokAt(4);
t->deleteNext();
t->deleteNext();
Token::eraseTokens(tok2, 3);
Token::eraseTokens(tok2->tokAt(4), 2);
}
}
}
Expand All @@ -1579,8 +1575,7 @@ void CheckMemoryLeakInFunction::simplifycode(Token *tok)

// Replace "{ }" with ";"
if (Token::simpleMatch(tok2->next(), "{ }")) {
tok2->deleteNext();
tok2->deleteNext();
Token::eraseTokens(tok2, 2);
tok2->insertToken(";");
done = false;
}
Expand All @@ -1605,8 +1600,7 @@ void CheckMemoryLeakInFunction::simplifycode(Token *tok)

// outer/inner if blocks. Remove outer condition..
else if (Token::Match(tok2->next(), "if|if(var) { if return use ; }")) {
tok2->deleteNext();
tok2->deleteNext();
Token::eraseTokens(tok2, 2);
tok2->tokAt(4)->deleteNext();
done = false;
}
Expand All @@ -1621,26 +1615,19 @@ void CheckMemoryLeakInFunction::simplifycode(Token *tok)
// Reduce "if X ; else X ;" => "X ;"
else if (Token::Match(tok2->next(), "if %var% ; else %var% ;") &&
tok2->strAt(2) == tok2->strAt(5)) {
tok2->deleteNext();
tok2->deleteNext();
tok2->deleteNext();
tok2->deleteNext();
Token::eraseTokens(tok2, 4);
done = false;
}

// Reduce "if continue ; if continue ;" => "if continue ;"
else if (Token::simpleMatch(tok2->next(), "if continue ; if continue ;")) {
tok2->deleteNext();
tok2->deleteNext();
tok2->deleteNext();
Token::eraseTokens(tok2, 3);
done = false;
}

// Reduce "if return ; alloc ;" => "alloc ;"
else if (Token::Match(tok2, "[;{}] if return ; alloc|return ;")) {
tok2->deleteNext();
tok2->deleteNext();
tok2->deleteNext();
Token::eraseTokens(tok2, 3);
done = false;
}

Expand All @@ -1649,44 +1636,31 @@ void CheckMemoryLeakInFunction::simplifycode(Token *tok)
// Remove "if"
tok2->deleteNext();
// Remove "; else return"
Token *t = tok2->next();
t->deleteNext();
t->deleteNext();
t->deleteNext();
Token::eraseTokens(tok2->next(), 3);
done = false;
}

// Reduce "if ; else %var% ;" => "if %var% ;"
else if (Token::Match(tok2->next(), "if ; else %var% ;")) {
Token *t = tok2->next();
t->deleteNext();
t->deleteNext();
Token::eraseTokens(tok2->next(), 2);
done = false;
}

// Reduce "if ; else" => "if"
else if (Token::simpleMatch(tok2->next(), "if ; else")) {
Token *t = tok2->next();
t->deleteNext();
t->deleteNext();
Token::eraseTokens(tok2->next(), 2);
done = false;
}

// Reduce "if return ; else|if return|continue ;" => "if return ;"
else if (Token::Match(tok2->next(), "if return ; else|if return|continue|break ;")) {
Token *t = tok2->tokAt(3);
t->deleteNext();
t->deleteNext();
t->deleteNext();
Token::eraseTokens(tok2->tokAt(3), 3);
done = false;
}

// Reduce "if continue|break ; else|if return ;" => "if return ;"
else if (Token::Match(tok2->next(), "if continue|break ; if|else return ;")) {
Token *t = tok2->next();
t->deleteNext();
t->deleteNext();
t->deleteNext();
Token::eraseTokens(tok2->next(), 3);
done = false;
}

Expand All @@ -1699,7 +1673,7 @@ void CheckMemoryLeakInFunction::simplifycode(Token *tok)
// Delete "if { dealloc|assign|use ; return ; }"
else if (Token::Match(tok2, "[;{}] if { dealloc|assign|use ; return ; }") &&
!Token::findmatch(tok, "if {| alloc ;")) {
Token::eraseTokens(tok2, tok2->tokAt(8));
Token::eraseTokens(tok2, 7);
if (Token::simpleMatch(tok2->next(), "else"))
tok2->deleteNext();
done = false;
Expand All @@ -1708,7 +1682,7 @@ void CheckMemoryLeakInFunction::simplifycode(Token *tok)
// Remove "if { dealloc ; callfunc ; } !!else|return"
else if (Token::Match(tok2->next(), "if { dealloc|assign ; callfunc ; }") &&
!Token::Match(tok2->tokAt(8), "else|return")) {
Token::eraseTokens(tok2, tok2->tokAt(8));
Token::eraseTokens(tok2, 7);
done = false;
}

Expand All @@ -1717,9 +1691,7 @@ void CheckMemoryLeakInFunction::simplifycode(Token *tok)

// Reduce "alloc while(!var) alloc ;" => "alloc ;"
if (Token::Match(tok2, "[;{}] alloc ; while(!var) alloc ;")) {
tok2->deleteNext();
tok2->deleteNext();
tok2->deleteNext();
Token::eraseTokens(tok2, 3);
done = false;
}

Expand Down Expand Up @@ -1750,8 +1722,7 @@ void CheckMemoryLeakInFunction::simplifycode(Token *tok)

// Reduce "if(!var) exit ;" => ";"
if (Token::simpleMatch(tok2, "; if(!var) exit ;")) {
tok2->deleteNext();
tok2->deleteNext();
Token::eraseTokens(tok2, 2);
done = false;
}

Expand All @@ -1766,8 +1737,7 @@ void CheckMemoryLeakInFunction::simplifycode(Token *tok)
tok2->str("if(var)");

// remove the "; else"
tok2->deleteNext();
tok2->deleteNext();
Token::eraseTokens(tok2, 2);
} else {
// remove the "if*"
tok2->deleteNext();
Expand All @@ -1792,17 +1762,13 @@ void CheckMemoryLeakInFunction::simplifycode(Token *tok)
// Reduce "while1 if break ;" => ";"
if (Token::simpleMatch(tok2, "while1 if break ;")) {
tok2->str(";");
tok2->deleteNext();
tok2->deleteNext();
Token::eraseTokens(tok2, 2);
done = false;
}

// Delete if block: "alloc; if return use ;"
if (Token::Match(tok2, "alloc ; if return use ; !!else")) {
tok2->deleteNext();
tok2->deleteNext();
tok2->deleteNext();
tok2->deleteNext();
Token::eraseTokens(tok2, 4);
done = false;
}

Expand All @@ -1827,39 +1793,33 @@ void CheckMemoryLeakInFunction::simplifycode(Token *tok)

// Remove the "if break|continue ;" that follows "dealloc ; alloc ;"
if (! _settings->experimental && Token::Match(tok2, "dealloc ; alloc ; if break|continue ;")) {
tok2 = tok2->tokAt(3);
tok2->deleteNext();
tok2->deleteNext();
Token::eraseTokens(tok2->tokAt(3), 2);
done = false;
}

// if break ; break ; => break ;
if (Token::Match(tok2->previous(), "[;{}] if break ; break ;")) {
tok2->deleteNext();
tok2->deleteNext();
tok2->deleteNext();
Token::eraseTokens(tok2, 3);
done = false;
}

// Reduce "do { dealloc ; alloc ; } while(var) ;" => ";"
if (Token::simpleMatch(tok2->next(), "do { dealloc ; alloc ; } while(var) ;")) {
Token::eraseTokens(tok2, tok2->tokAt(9));
Token::eraseTokens(tok2, 8);
done = false;
}

// Reduce "do { alloc ; } " => "alloc ;"
/** @todo If the loop "do { alloc ; }" can be executed twice, reduce it to "loop alloc ;" */
if (Token::simpleMatch(tok2->next(), "do { alloc ; }")) {
tok2->deleteNext();
tok2->deleteNext();
Token::eraseTokens(tok2, 2);
tok2->tokAt(2)->deleteNext();
done = false;
}

// Reduce "loop break ; => ";"
if (Token::Match(tok2->next(), "loop break|continue ;")) {
tok2->deleteNext();
tok2->deleteNext();
Token::eraseTokens(tok2, 2);
done = false;
}

Expand All @@ -1871,25 +1831,19 @@ void CheckMemoryLeakInFunction::simplifycode(Token *tok)

// Reduce "loop if break|continue ; !!else" => ";"
if (Token::Match(tok2->next(), "loop if break|continue ; !!else")) {
tok2->deleteNext();
tok2->deleteNext();
tok2->deleteNext();
Token::eraseTokens(tok2, 3);
done = false;
}

// Reduce "loop { if break|continue ; !!else" => "loop {"
if (Token::Match(tok2, "loop { if break|continue ; !!else")) {
Token *t = tok2->next();
t->deleteNext();
t->deleteNext();
t->deleteNext();
Token::eraseTokens(tok2->next(), 3);
done = false;
}

// Replace "do ; loop ;" with ";"
if (Token::simpleMatch(tok2, "; loop ;")) {
tok2->deleteNext();
tok2->deleteNext();
Token::eraseTokens(tok2, 2);
done = false;
}

Expand Down Expand Up @@ -1921,17 +1875,15 @@ void CheckMemoryLeakInFunction::simplifycode(Token *tok)
// loop { use ; callfunc ; } => use ;
// assume that the "callfunc" is not noreturn
if (Token::simpleMatch(tok2, "loop { use ; callfunc ; }")) {
Token::eraseTokens(tok2, tok2->tokAt(7));
Token::eraseTokens(tok2, 6);
tok2->str("use");
tok2->insertToken(";");
done = false;
}

// Delete if block in "alloc ; if(!var) return ;"
if (Token::simpleMatch(tok2, "alloc ; if(!var) return ;")) {
tok2->deleteNext();
tok2->deleteNext();
tok2->deleteNext();
Token::eraseTokens(tok2, 3);
done = false;
}

Expand All @@ -1950,17 +1902,13 @@ void CheckMemoryLeakInFunction::simplifycode(Token *tok)
// malloc - realloc => alloc ; dealloc ; alloc ;
// Reduce "[;{}] alloc ; dealloc ; alloc ;" => "[;{}] alloc ;"
if (Token::Match(tok2, "[;{}] alloc ; dealloc ; alloc ;")) {
tok2->deleteNext();
tok2->deleteNext();
tok2->deleteNext();
tok2->deleteNext();
Token::eraseTokens(tok2, 4);
done = false;
}

// use; dealloc; => dealloc;
if (Token::Match(tok2, "[;{}] use ; dealloc ;")) {
tok2->deleteNext();
tok2->deleteNext();
Token::eraseTokens(tok2, 2);
done = false;
}

Expand All @@ -1973,33 +1921,28 @@ void CheckMemoryLeakInFunction::simplifycode(Token *tok)
// use; if| use; => use;
while (Token::Match(tok2, "[;{}] use ; if| use ;")) {
Token *t = tok2->tokAt(2);
t->deleteNext();
t->deleteNext();
if (t->strAt(1) == ";")
Token::eraseTokens(t, 2);
if (t->next() && t->next()->str() == ";")
t->deleteNext();
done = false;
}

// Delete first part in "use ; return use ;"
if (Token::Match(tok2, "[;{}] use ; return use ;")) {
tok2->deleteNext();
tok2->deleteNext();
Token::eraseTokens(tok2, 2);
done = false;
}

// try/catch
if (Token::simpleMatch(tok2, "try ; catch exit ;")) {
tok2->deleteNext();
tok2->deleteNext();
tok2->deleteNext();
Token::eraseTokens(tok2, 3);
tok2->deleteThis();
done = false;
}

// Delete second case in "case ; case ;"
while (Token::simpleMatch(tok2, "case ; case ;")) {
tok2->deleteNext();
tok2->deleteNext();
Token::eraseTokens(tok2, 2);
done = false;
}

Expand Down
7 changes: 2 additions & 5 deletions lib/preprocessor.cpp
Expand Up @@ -1341,9 +1341,7 @@ void Preprocessor::simplifyCondition(const std::map<std::string, std::string> &c
tok->str("0");
else
continue;
tok->deleteNext();
tok->deleteNext();
tok->deleteNext();
Token::eraseTokens(tok, 3);
continue;
}

Expand Down Expand Up @@ -1416,8 +1414,7 @@ void Preprocessor::simplifyCondition(const std::map<std::string, std::string> &c

for (Token *tok = const_cast<Token *>(tokenizer.tokens()); tok; tok = tok->next()) {
while (Token::Match(tok, "(|%oror% %any% %oror% 1")) {
tok->deleteNext();
tok->deleteNext();
Token::eraseTokens(tok, 2);
if (tok->tokAt(-3))
tok = tok->tokAt(-3);
}
Expand Down
10 changes: 10 additions & 0 deletions lib/token.cpp
Expand Up @@ -866,6 +866,16 @@ void Token::eraseTokens(Token *begin, const Token *end)
}
}

void Token::eraseTokens(Token *tok, unsigned long index)
{
if (!tok)
return;

while (tok->next() && index--) {
tok->deleteNext();
}
}

void Token::createMutualLinks(Token *begin, Token *end)
{
assert(begin != NULL);
Expand Down

7 comments on commit 612b3c5

@danmar
Copy link
Owner

@danmar danmar commented on 612b3c5 Dec 7, 2011

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It seems to me that there is a subtle difference how Token::eraseTokens behaves if it is given a token or a value. It would make more sense to me if these calls where the same:
Token::eraseTokens(tok, tok->tokAt(4));
Token::eraseTokens(tok, 4);

How about:
tok->deleteNext(3);
tok->deleteThis(3);

@danmar
Copy link
Owner

@danmar danmar commented on 612b3c5 Dec 7, 2011

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I guess we could also change Token::eraseTokens so it will also delete the start and end tokens. However I would want to see a pull request or patch for this first then so I see what changes this would mean.

@edward-san
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

imho if Token::eraseTokens should be changed, let it delete also the end token, but not the beginning one. Removing also the beginning one makes it easy to do this kind of code:

for (Token *tok = _tokens; tok; tok = tok->next()) {
    if (somecondition)
        Token::eraseTokens(tok, tok->tokAt(5));
}

this code would cause a memory corruption IIRC (if not, whatever it happens, valgrind would write tons of errors), because you lose 'tok'.

@danmar
Copy link
Owner

@danmar danmar commented on 612b3c5 Dec 7, 2011

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'd prefer tok->deleteNext(4) instead of Token::eraseTokens(tok,4).

@edward-san
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

All right, I'll make deleteNext(default value = 1).
Question: is it possible to optimize this code:

void Token::deleteNext(unsigned long index)
{
    while(index--) {
        Token *n = _next;
        _next = n->next();
        delete n;
        if (_next)
            _next->previous(this);
        else if (tokensBack)
            *tokensBack = this;
    }
}

@danmar
Copy link
Owner

@danmar danmar commented on 612b3c5 Dec 7, 2011

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

good question.. I guess:

void Token::deleteNext(unsigned long index)
{
    while (index-- && _next) {
        Token *n = _next;
        _next = n->_next;
        delete n;
    }

    if (_next)
        _next->previous(this);
    else if (tokensBack)
        *tokensBack = this;
}

@edward-san
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Alright, I'll do that.

Please sign in to comment.