Use LazyInit for ContractDefinition::m_interfaceFunctionList

This commit is contained in:
Jason Cobb 2020-05-13 13:59:15 -04:00
parent 413fa92cee
commit cffd1eaff1
No known key found for this signature in database
GPG Key ID: 2A3F6A6DCA1E8DED
2 changed files with 8 additions and 7 deletions

View File

@ -179,10 +179,10 @@ vector<EventDefinition const*> const& ContractDefinition::interfaceEvents() cons
vector<pair<util::FixedHash<4>, FunctionTypePointer>> const& ContractDefinition::interfaceFunctionList(bool _includeInheritedFunctions) const vector<pair<util::FixedHash<4>, FunctionTypePointer>> const& ContractDefinition::interfaceFunctionList(bool _includeInheritedFunctions) const
{ {
if (!m_interfaceFunctionList[_includeInheritedFunctions]) return m_interfaceFunctionList[_includeInheritedFunctions].init([&]{
{
set<string> signaturesSeen; set<string> signaturesSeen;
m_interfaceFunctionList[_includeInheritedFunctions] = make_unique<vector<pair<util::FixedHash<4>, FunctionTypePointer>>>(); vector<pair<util::FixedHash<4>, FunctionTypePointer>> interfaceFunctionList;
for (ContractDefinition const* contract: annotation().linearizedBaseContracts) for (ContractDefinition const* contract: annotation().linearizedBaseContracts)
{ {
if (_includeInheritedFunctions == false && contract != this) if (_includeInheritedFunctions == false && contract != this)
@ -204,12 +204,13 @@ vector<pair<util::FixedHash<4>, FunctionTypePointer>> const& ContractDefinition:
{ {
signaturesSeen.insert(functionSignature); signaturesSeen.insert(functionSignature);
util::FixedHash<4> hash(util::keccak256(functionSignature)); util::FixedHash<4> hash(util::keccak256(functionSignature));
m_interfaceFunctionList[_includeInheritedFunctions]->emplace_back(hash, fun); interfaceFunctionList.emplace_back(hash, fun);
} }
} }
} }
}
return *m_interfaceFunctionList[_includeInheritedFunctions]; return interfaceFunctionList;
});
} }
TypePointer ContractDefinition::type() const TypePointer ContractDefinition::type() const

View File

@ -530,7 +530,7 @@ private:
ContractKind m_contractKind; ContractKind m_contractKind;
bool m_abstract{false}; bool m_abstract{false};
mutable std::unique_ptr<std::vector<std::pair<util::FixedHash<4>, FunctionTypePointer>>> m_interfaceFunctionList[2]; util::LazyInit<std::vector<std::pair<util::FixedHash<4>, FunctionTypePointer>>> m_interfaceFunctionList[2];
util::LazyInit<std::vector<EventDefinition const*>> m_interfaceEvents; util::LazyInit<std::vector<EventDefinition const*>> m_interfaceEvents;
}; };