Skip to content

Commit 9dc139b

Browse files
committed
refs #13698/#10663 - symboldatabase.cpp: moved up some conditions in parsedecl() to reduce impossible container lookups [skip ci]
1 parent 0353cfe commit 9dc139b

File tree

1 file changed

+51
-51
lines changed

1 file changed

+51
-51
lines changed

lib/symboldatabase.cpp

Lines changed: 51 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -7304,7 +7304,57 @@ static const Token* parsedecl(const Token* type,
73047304
if (valuetype->typeScope)
73057305
valuetype->type = (scope->type == ScopeType::eClass) ? ValueType::Type::RECORD : ValueType::Type::NONSTD;
73067306
}
7307-
} else if (const Library::Container* container = (cpp ? settings.library.detectContainerOrIterator(type, &isIterator) : nullptr)) {
7307+
} else if (ValueType::Type::UNKNOWN_TYPE != ValueType::typeFromString(type->str(), type->isLong())) {
7308+
const ValueType::Type t0 = valuetype->type;
7309+
valuetype->type = ValueType::typeFromString(type->str(), type->isLong());
7310+
if (t0 == ValueType::Type::LONG) {
7311+
if (valuetype->type == ValueType::Type::LONG)
7312+
valuetype->type = ValueType::Type::LONGLONG;
7313+
else if (valuetype->type == ValueType::Type::DOUBLE)
7314+
valuetype->type = ValueType::Type::LONGDOUBLE;
7315+
}
7316+
} else if (type->str() == "auto") {
7317+
const ValueType *vt = type->valueType();
7318+
if (!vt)
7319+
return nullptr;
7320+
valuetype->type = vt->type;
7321+
valuetype->pointer = vt->pointer;
7322+
valuetype->reference = vt->reference;
7323+
if (vt->sign != ValueType::Sign::UNKNOWN_SIGN)
7324+
valuetype->sign = vt->sign;
7325+
valuetype->constness = vt->constness;
7326+
valuetype->volatileness = vt->volatileness;
7327+
valuetype->originalTypeName = vt->originalTypeName;
7328+
const bool hasConst = Token::simpleMatch(type->previous(), "const");
7329+
const bool hasVolatile = Token::simpleMatch(type->previous(), "volatile");
7330+
while (Token::Match(type, "%name%|*|&|&&|::") && !type->variable()) {
7331+
if (type->str() == "*") {
7332+
valuetype->pointer = 1;
7333+
if (hasConst)
7334+
valuetype->constness = 1;
7335+
if (hasVolatile)
7336+
valuetype->volatileness = 1;
7337+
} else if (type->str() == "&") {
7338+
valuetype->reference = Reference::LValue;
7339+
} else if (type->str() == "&&") {
7340+
valuetype->reference = Reference::RValue;
7341+
}
7342+
if (type->str() == "const")
7343+
valuetype->constness |= (1 << valuetype->pointer);
7344+
if (type->str() == "volatile")
7345+
valuetype->volatileness |= (1 << valuetype->pointer);
7346+
type = type->next();
7347+
}
7348+
break;
7349+
} else if (type->str() == "*")
7350+
valuetype->pointer++;
7351+
else if (type->str() == "&")
7352+
valuetype->reference = Reference::LValue;
7353+
else if (type->str() == "&&")
7354+
valuetype->reference = Reference::RValue;
7355+
else if (type->isStandardType())
7356+
valuetype->fromLibraryType(type->str(), settings);
7357+
else if (const Library::Container* container = (cpp ? settings.library.detectContainerOrIterator(type, &isIterator) : nullptr)) {
73087358
if (isIterator)
73097359
valuetype->type = ValueType::Type::ITERATOR;
73107360
else
@@ -7348,48 +7398,6 @@ static const Token* parsedecl(const Token* type,
73487398
typestr += end->str();
73497399
if (valuetype->fromLibraryType(typestr, settings))
73507400
type = end;
7351-
} else if (ValueType::Type::UNKNOWN_TYPE != ValueType::typeFromString(type->str(), type->isLong())) {
7352-
const ValueType::Type t0 = valuetype->type;
7353-
valuetype->type = ValueType::typeFromString(type->str(), type->isLong());
7354-
if (t0 == ValueType::Type::LONG) {
7355-
if (valuetype->type == ValueType::Type::LONG)
7356-
valuetype->type = ValueType::Type::LONGLONG;
7357-
else if (valuetype->type == ValueType::Type::DOUBLE)
7358-
valuetype->type = ValueType::Type::LONGDOUBLE;
7359-
}
7360-
} else if (type->str() == "auto") {
7361-
const ValueType *vt = type->valueType();
7362-
if (!vt)
7363-
return nullptr;
7364-
valuetype->type = vt->type;
7365-
valuetype->pointer = vt->pointer;
7366-
valuetype->reference = vt->reference;
7367-
if (vt->sign != ValueType::Sign::UNKNOWN_SIGN)
7368-
valuetype->sign = vt->sign;
7369-
valuetype->constness = vt->constness;
7370-
valuetype->volatileness = vt->volatileness;
7371-
valuetype->originalTypeName = vt->originalTypeName;
7372-
const bool hasConst = Token::simpleMatch(type->previous(), "const");
7373-
const bool hasVolatile = Token::simpleMatch(type->previous(), "volatile");
7374-
while (Token::Match(type, "%name%|*|&|&&|::") && !type->variable()) {
7375-
if (type->str() == "*") {
7376-
valuetype->pointer = 1;
7377-
if (hasConst)
7378-
valuetype->constness = 1;
7379-
if (hasVolatile)
7380-
valuetype->volatileness = 1;
7381-
} else if (type->str() == "&") {
7382-
valuetype->reference = Reference::LValue;
7383-
} else if (type->str() == "&&") {
7384-
valuetype->reference = Reference::RValue;
7385-
}
7386-
if (type->str() == "const")
7387-
valuetype->constness |= (1 << valuetype->pointer);
7388-
if (type->str() == "volatile")
7389-
valuetype->volatileness |= (1 << valuetype->pointer);
7390-
type = type->next();
7391-
}
7392-
break;
73937401
} else if (!valuetype->typeScope && (type->str() == "struct" || type->str() == "enum") && valuetype->type != ValueType::Type::SMART_POINTER)
73947402
valuetype->type = type->str() == "struct" ? ValueType::Type::RECORD : ValueType::Type::NONSTD;
73957403
else if (!valuetype->typeScope && type->type() && type->type()->classScope && valuetype->type != ValueType::Type::SMART_POINTER) {
@@ -7402,14 +7410,6 @@ static const Token* parsedecl(const Token* type,
74027410
valuetype->typeScope = type->type()->classScope;
74037411
} else if (type->isName() && valuetype->sign != ValueType::Sign::UNKNOWN_SIGN && valuetype->pointer == 0U)
74047412
return nullptr;
7405-
else if (type->str() == "*")
7406-
valuetype->pointer++;
7407-
else if (type->str() == "&")
7408-
valuetype->reference = Reference::LValue;
7409-
else if (type->str() == "&&")
7410-
valuetype->reference = Reference::RValue;
7411-
else if (type->isStandardType())
7412-
valuetype->fromLibraryType(type->str(), settings);
74137413
else if (Token::Match(type->previous(), "!!:: %name% !!::"))
74147414
valuetype->fromLibraryType(type->str(), settings);
74157415
if (!type->originalName().empty())

0 commit comments

Comments
 (0)