Tokenizer::simplifyTypedef: some optimizations on new code.

This commit is contained in:
Edoardo Prezioso 2012-01-30 17:08:35 +01:00
parent 7cd36f44b6
commit 11e724df46
1 changed files with 40 additions and 30 deletions

View File

@ -1147,11 +1147,13 @@ void Tokenizer::simplifyTypedef()
// name token wasn't a name, it was part of the type // name token wasn't a name, it was part of the type
typeEnd = typeEnd->next(); typeEnd = typeEnd->next();
functionPtr = true; functionPtr = true;
funcStart = tokOffset->next(); tokOffset = tokOffset->next();
funcEnd = tokOffset->next(); funcStart = tokOffset;
typeName = tokOffset->tokAt(2); funcEnd = tokOffset;
argStart = tokOffset->tokAt(4); tokOffset = tokOffset->tokAt(3);
argEnd = tokOffset->linkAt(4); typeName = tokOffset->tokAt(-2);
argStart = tokOffset;
argEnd = tokOffset->link();
tok = argEnd->next(); tok = argEnd->next();
} }
@ -1221,10 +1223,11 @@ void Tokenizer::simplifyTypedef()
else else
function = true; function = true;
funcStart = tokOffset->next(); funcStart = tokOffset->next();
funcEnd = tokOffset->link()->tokAt(-2); tokOffset = tokOffset->link();
typeName = tokOffset->link()->previous(); funcEnd = tokOffset->tokAt(-2);
argStart = tokOffset->link()->next(); typeName = tokOffset->previous();
argEnd = tokOffset->link()->next()->link(); argStart = tokOffset->next();
argEnd = tokOffset->next()->link();
tok = argEnd->next(); tok = argEnd->next();
Token *spec = tok; Token *spec = tok;
if (Token::Match(spec, "const|volatile")) { if (Token::Match(spec, "const|volatile")) {
@ -1243,10 +1246,11 @@ void Tokenizer::simplifyTypedef()
else if (Token::Match(tokOffset, "( %type% (")) { else if (Token::Match(tokOffset, "( %type% (")) {
function = true; function = true;
if (tokOffset->link()->next()) { if (tokOffset->link()->next()) {
typeName = tokOffset->next();
argStart = tokOffset->tokAt(2);
argEnd = tokOffset->linkAt(2);
tok = tokOffset->link()->next(); tok = tokOffset->link()->next();
tokOffset = tokOffset->tokAt(2);
typeName = tokOffset->previous();
argStart = tokOffset;
argEnd = tokOffset->link();
} else { } else {
// internal error // internal error
continue; continue;
@ -1259,12 +1263,13 @@ void Tokenizer::simplifyTypedef()
Token::Match(tokOffset->linkAt(6)->linkAt(2), ") ;|,")) { Token::Match(tokOffset->linkAt(6)->linkAt(2), ") ;|,")) {
functionPtrRetFuncPtr = true; functionPtrRetFuncPtr = true;
typeName = tokOffset->tokAt(4); tokOffset = tokOffset->tokAt(6);
argStart = tokOffset->tokAt(6); typeName = tokOffset->tokAt(-2);
argEnd = tokOffset->linkAt(6); argStart = tokOffset;
argEnd = tokOffset->link();
argFuncRetStart = argEnd->tokAt(2); argFuncRetStart = argEnd->tokAt(2);
argFuncRetEnd = argEnd->linkAt(2); argFuncRetEnd = argFuncRetStart->link();
tok = argFuncRetEnd->next(); tok = argFuncRetEnd->next();
} }
@ -1275,23 +1280,25 @@ void Tokenizer::simplifyTypedef()
Token::Match(tokOffset->linkAt(3)->linkAt(2), ") ;|,")) { Token::Match(tokOffset->linkAt(3)->linkAt(2), ") ;|,")) {
functionRetFuncPtr = true; functionRetFuncPtr = true;
typeName = tokOffset->tokAt(2); tokOffset = tokOffset->tokAt(3);
argStart = tokOffset->tokAt(3); typeName = tokOffset->previous();
argEnd = tokOffset->linkAt(3); argStart = tokOffset;
argEnd = tokOffset->link();
argFuncRetStart = argEnd->tokAt(2); argFuncRetStart = argEnd->tokAt(2);
argFuncRetEnd = argEnd->linkAt(2); argFuncRetEnd = argFuncRetStart->link();
tok = argFuncRetEnd->next(); tok = argFuncRetEnd->next();
} else if (Token::Match(tokOffset, "( * ( %type% ) (")) { } else if (Token::Match(tokOffset, "( * ( %type% ) (")) {
functionRetFuncPtr = true; functionRetFuncPtr = true;
typeName = tokOffset->tokAt(3); tokOffset = tokOffset->tokAt(5);
argStart = tokOffset->tokAt(5); typeName = tokOffset->tokAt(-2);
argEnd = tokOffset->linkAt(5); argStart = tokOffset;
argEnd = tokOffset->link();
argFuncRetStart = argEnd->tokAt(2); argFuncRetStart = argEnd->tokAt(2);
argFuncRetEnd = argEnd->linkAt(2); argFuncRetEnd = argFuncRetStart->link();
tok = argFuncRetEnd->next(); tok = argFuncRetEnd->next();
} }
@ -1300,19 +1307,22 @@ void Tokenizer::simplifyTypedef()
else if (Token::Match(tokOffset, "( *|& %type% ) [")) { else if (Token::Match(tokOffset, "( *|& %type% ) [")) {
ptrToArray = (tokOffset->next()->str() == "*"); ptrToArray = (tokOffset->next()->str() == "*");
refToArray = (tokOffset->next()->str() == "&"); refToArray = (tokOffset->next()->str() == "&");
typeName = tokOffset->tokAt(2); tokOffset = tokOffset->tokAt(2);
arrayStart = tokOffset->tokAt(4); typeName = tokOffset;
arrayStart = tokOffset->tokAt(2);
arrayEnd = arrayStart->link(); arrayEnd = arrayStart->link();
tok = arrayEnd->next(); tok = arrayEnd->next();
} }
// pointer to class member // pointer to class member
else if (Token::Match(tokOffset, "( %type% :: * %type% ) ;")) { else if (Token::Match(tokOffset, "( %type% :: * %type% ) ;")) {
namespaceStart = tokOffset->next(); tokOffset = tokOffset->tokAt(2);
namespaceEnd = tokOffset->tokAt(2); namespaceStart = tokOffset->previous();
namespaceEnd = tokOffset;
ptrMember = true; ptrMember = true;
typeName = tokOffset->tokAt(4); tokOffset = tokOffset->tokAt(2);
tok = tokOffset->tokAt(6); typeName = tokOffset;
tok = tokOffset->tokAt(2);
} }
// unhandled typedef, skip it and continue // unhandled typedef, skip it and continue