Optimization: Reduced memory consumption of token list
- allocate memory for mTemplateSimplifierPointers only if necessary - reordered member variables in TokenImpl
This commit is contained in:
parent
c409daf918
commit
ade253a730
@ -195,8 +195,8 @@ TemplateSimplifier::TokenAndName::TokenAndName(const TokenAndName& other) :
|
|||||||
|
|
||||||
TemplateSimplifier::TokenAndName::~TokenAndName()
|
TemplateSimplifier::TokenAndName::~TokenAndName()
|
||||||
{
|
{
|
||||||
if (mToken)
|
if (mToken && mToken->templateSimplifierPointers())
|
||||||
mToken->templateSimplifierPointers().erase(this);
|
mToken->templateSimplifierPointers()->erase(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
const Token * TemplateSimplifier::TokenAndName::aliasStartToken() const
|
const Token * TemplateSimplifier::TokenAndName::aliasStartToken() const
|
||||||
@ -3107,12 +3107,12 @@ void TemplateSimplifier::replaceTemplateUsage(
|
|||||||
Token::Match(nameTok, "template|const_cast|dynamic_cast|reinterpret_cast|static_cast"))
|
Token::Match(nameTok, "template|const_cast|dynamic_cast|reinterpret_cast|static_cast"))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
std::set<TemplateSimplifier::TokenAndName*> & pointers = nameTok->templateSimplifierPointers();
|
std::set<TemplateSimplifier::TokenAndName*>* pointers = nameTok->templateSimplifierPointers();
|
||||||
|
|
||||||
// check if instantiation matches token instantiation from pointer
|
// check if instantiation matches token instantiation from pointer
|
||||||
if (pointers.size()) {
|
if (pointers && pointers->size()) {
|
||||||
// check full name
|
// check full name
|
||||||
if (instantiation.fullName() != (*pointers.begin())->fullName()) {
|
if (instantiation.fullName() != (*pointers->begin())->fullName()) {
|
||||||
// FIXME: fallback to just matching name
|
// FIXME: fallback to just matching name
|
||||||
if (nameTok->str() != instantiation.name())
|
if (nameTok->str() != instantiation.name())
|
||||||
continue;
|
continue;
|
||||||
@ -3173,7 +3173,7 @@ void TemplateSimplifier::replaceTemplateUsage(
|
|||||||
nameTok->str(newName);
|
nameTok->str(newName);
|
||||||
|
|
||||||
for (Token *tok = nameTok1->next(); tok != tok2; tok = tok->next()) {
|
for (Token *tok = nameTok1->next(); tok != tok2; tok = tok->next()) {
|
||||||
if (tok->isName() && !tok->templateSimplifierPointers().empty()) {
|
if (tok->isName() && tok->templateSimplifierPointers() && !tok->templateSimplifierPointers()->empty()) {
|
||||||
std::list<TokenAndName>::iterator ti;
|
std::list<TokenAndName>::iterator ti;
|
||||||
for (ti = mTemplateInstantiations.begin(); ti != mTemplateInstantiations.end();) {
|
for (ti = mTemplateInstantiations.begin(); ti != mTemplateInstantiations.end();) {
|
||||||
if (ti->token() == tok) {
|
if (ti->token() == tok) {
|
||||||
|
@ -251,11 +251,13 @@ void Token::swapWithNext()
|
|||||||
std::swap(mTokType, mNext->mTokType);
|
std::swap(mTokType, mNext->mTokType);
|
||||||
std::swap(mFlags, mNext->mFlags);
|
std::swap(mFlags, mNext->mFlags);
|
||||||
std::swap(mImpl, mNext->mImpl);
|
std::swap(mImpl, mNext->mImpl);
|
||||||
for (auto *templateSimplifierPointer : mImpl->mTemplateSimplifierPointers) {
|
if (mImpl->mTemplateSimplifierPointers)
|
||||||
|
for (auto *templateSimplifierPointer : *mImpl->mTemplateSimplifierPointers) {
|
||||||
templateSimplifierPointer->token(this);
|
templateSimplifierPointer->token(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (auto *templateSimplifierPointer : mNext->mImpl->mTemplateSimplifierPointers) {
|
if (mNext->mImpl->mTemplateSimplifierPointers)
|
||||||
|
for (auto *templateSimplifierPointer : *mNext->mImpl->mTemplateSimplifierPointers) {
|
||||||
templateSimplifierPointer->token(mNext);
|
templateSimplifierPointer->token(mNext);
|
||||||
}
|
}
|
||||||
if (mNext->mLink)
|
if (mNext->mLink)
|
||||||
@ -274,7 +276,8 @@ void Token::takeData(Token *fromToken)
|
|||||||
delete mImpl;
|
delete mImpl;
|
||||||
mImpl = fromToken->mImpl;
|
mImpl = fromToken->mImpl;
|
||||||
fromToken->mImpl = nullptr;
|
fromToken->mImpl = nullptr;
|
||||||
for (auto *templateSimplifierPointer : mImpl->mTemplateSimplifierPointers) {
|
if (mImpl->mTemplateSimplifierPointers)
|
||||||
|
for (auto *templateSimplifierPointer : *mImpl->mTemplateSimplifierPointers) {
|
||||||
templateSimplifierPointer->token(this);
|
templateSimplifierPointer->token(this);
|
||||||
}
|
}
|
||||||
mLink = fromToken->mLink;
|
mLink = fromToken->mLink;
|
||||||
@ -2211,9 +2214,11 @@ TokenImpl::~TokenImpl()
|
|||||||
delete mValueType;
|
delete mValueType;
|
||||||
delete mValues;
|
delete mValues;
|
||||||
|
|
||||||
for (auto *templateSimplifierPointer : mTemplateSimplifierPointers) {
|
if (mTemplateSimplifierPointers)
|
||||||
|
for (auto *templateSimplifierPointer : *mTemplateSimplifierPointers) {
|
||||||
templateSimplifierPointer->token(nullptr);
|
templateSimplifierPointer->token(nullptr);
|
||||||
}
|
}
|
||||||
|
delete mTemplateSimplifierPointers;
|
||||||
|
|
||||||
while (mCppcheckAttributes) {
|
while (mCppcheckAttributes) {
|
||||||
struct CppcheckAttributes *c = mCppcheckAttributes;
|
struct CppcheckAttributes *c = mCppcheckAttributes;
|
||||||
|
18
lib/token.h
18
lib/token.h
@ -99,11 +99,8 @@ struct TokenImpl {
|
|||||||
std::list<ValueFlow::Value>* mValues;
|
std::list<ValueFlow::Value>* mValues;
|
||||||
static const std::list<ValueFlow::Value> mEmptyValueList;
|
static const std::list<ValueFlow::Value> mEmptyValueList;
|
||||||
|
|
||||||
/** Bitfield bit count. */
|
|
||||||
unsigned char mBits;
|
|
||||||
|
|
||||||
// Pointer to a template in the template simplifier
|
// Pointer to a template in the template simplifier
|
||||||
std::set<TemplateSimplifier::TokenAndName*> mTemplateSimplifierPointers;
|
std::set<TemplateSimplifier::TokenAndName*>* mTemplateSimplifierPointers;
|
||||||
|
|
||||||
// Pointer to the object representing this token's scope
|
// Pointer to the object representing this token's scope
|
||||||
std::shared_ptr<ScopeInfo2> mScopeInfo;
|
std::shared_ptr<ScopeInfo2> mScopeInfo;
|
||||||
@ -119,6 +116,9 @@ struct TokenImpl {
|
|||||||
// For memoization, to speed up parsing of huge arrays #8897
|
// For memoization, to speed up parsing of huge arrays #8897
|
||||||
enum class Cpp11init {UNKNOWN, CPP11INIT, NOINIT} mCpp11init;
|
enum class Cpp11init {UNKNOWN, CPP11INIT, NOINIT} mCpp11init;
|
||||||
|
|
||||||
|
/** Bitfield bit count. */
|
||||||
|
unsigned char mBits;
|
||||||
|
|
||||||
void setCppcheckAttribute(CppcheckAttributes::Type type, MathLib::bigint value);
|
void setCppcheckAttribute(CppcheckAttributes::Type type, MathLib::bigint value);
|
||||||
bool getCppcheckAttribute(CppcheckAttributes::Type type, MathLib::bigint *value) const;
|
bool getCppcheckAttribute(CppcheckAttributes::Type type, MathLib::bigint *value) const;
|
||||||
|
|
||||||
@ -137,11 +137,11 @@ struct TokenImpl {
|
|||||||
, mOriginalName(nullptr)
|
, mOriginalName(nullptr)
|
||||||
, mValueType(nullptr)
|
, mValueType(nullptr)
|
||||||
, mValues(nullptr)
|
, mValues(nullptr)
|
||||||
, mBits(0)
|
, mTemplateSimplifierPointers(nullptr)
|
||||||
, mTemplateSimplifierPointers()
|
|
||||||
, mScopeInfo(nullptr)
|
, mScopeInfo(nullptr)
|
||||||
, mCppcheckAttributes(nullptr)
|
, mCppcheckAttributes(nullptr)
|
||||||
, mCpp11init(Cpp11init::UNKNOWN)
|
, mCpp11init(Cpp11init::UNKNOWN)
|
||||||
|
, mBits(0)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
~TokenImpl();
|
~TokenImpl();
|
||||||
@ -607,11 +607,13 @@ public:
|
|||||||
unsigned char bits() const {
|
unsigned char bits() const {
|
||||||
return mImpl->mBits;
|
return mImpl->mBits;
|
||||||
}
|
}
|
||||||
std::set<TemplateSimplifier::TokenAndName*> &templateSimplifierPointers() const {
|
std::set<TemplateSimplifier::TokenAndName*>* templateSimplifierPointers() const {
|
||||||
return mImpl->mTemplateSimplifierPointers;
|
return mImpl->mTemplateSimplifierPointers;
|
||||||
}
|
}
|
||||||
void templateSimplifierPointer(TemplateSimplifier::TokenAndName* tokenAndName) {
|
void templateSimplifierPointer(TemplateSimplifier::TokenAndName* tokenAndName) {
|
||||||
mImpl->mTemplateSimplifierPointers.insert(tokenAndName);
|
if (!mImpl->mTemplateSimplifierPointers)
|
||||||
|
mImpl->mTemplateSimplifierPointers = new std::set<TemplateSimplifier::TokenAndName*>;
|
||||||
|
mImpl->mTemplateSimplifierPointers->insert(tokenAndName);
|
||||||
}
|
}
|
||||||
void setBits(const unsigned char b) {
|
void setBits(const unsigned char b) {
|
||||||
mImpl->mBits = b;
|
mImpl->mBits = b;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user