Skip to content

Commit 45a7d83

Browse files
committed
Cache functions by name.
1 parent 7d1df95 commit 45a7d83

File tree

2 files changed

+29
-4
lines changed

2 files changed

+29
-4
lines changed

libsolidity/ast/AST.cpp

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,9 @@
2929
#include <libsolidity/ast/TypeProvider.h>
3030
#include <libsolutil/Keccak256.h>
3131

32+
#include <range/v3/view/map.hpp>
33+
#include <range/v3/span.hpp>
34+
3235
#include <boost/algorithm/string.hpp>
3336

3437
#include <algorithm>
@@ -276,6 +279,17 @@ FunctionDefinition const* ContractDefinition::nextConstructor(ContractDefinition
276279
return nullptr;
277280
}
278281

282+
multimap<std::string, FunctionDefinition const*> ContractDefinition::definedFunctionsByName() const
283+
{
284+
return m_definedFunctionsByName.init([&]{
285+
std::multimap<std::string, FunctionDefinition const*> result;
286+
for (FunctionDefinition const* fun: filteredNodes<FunctionDefinition>(m_subNodes))
287+
result.insert({fun->name(), fun});
288+
return result;
289+
});
290+
}
291+
292+
279293
TypeNameAnnotation& TypeName::annotation() const
280294
{
281295
return initAnnotation<TypeNameAnnotation>();
@@ -397,6 +411,7 @@ FunctionDefinition const& FunctionDefinition::resolveVirtual(
397411
) const
398412
{
399413
solAssert(!isConstructor(), "");
414+
solAssert(!name().empty(), "");
400415
// If we are not doing super-lookup and the function is not virtual, we can stop here.
401416
if (_searchStart == nullptr && !virtualSemantics())
402417
return *this;
@@ -412,10 +427,8 @@ FunctionDefinition const& FunctionDefinition::resolveVirtual(
412427
if (_searchStart != nullptr && c != _searchStart)
413428
continue;
414429
_searchStart = nullptr;
415-
for (FunctionDefinition const* function: c->definedFunctions())
430+
for (FunctionDefinition const* function: c->definedFunctions(&name()))
416431
if (
417-
function->name() == name() &&
418-
!function->isConstructor() &&
419432
FunctionType(*function).asExternallyCallableFunction(false)->hasEqualParameterTypes(*functionType)
420433
)
421434
return *function;

libsolidity/ast/AST.h

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,9 @@
3636

3737
#include <json/json.h>
3838

39+
#include <range/v3/span.hpp>
40+
#include <range/v3/view/transform.hpp>
41+
3942
#include <memory>
4043
#include <optional>
4144
#include <string>
@@ -496,7 +499,13 @@ class ContractDefinition: public Declaration, public StructurallyDocumented, pub
496499
std::vector<EnumDefinition const*> definedEnums() const { return filteredNodes<EnumDefinition>(m_subNodes); }
497500
std::vector<VariableDeclaration const*> stateVariables() const { return filteredNodes<VariableDeclaration>(m_subNodes); }
498501
std::vector<ModifierDefinition const*> functionModifiers() const { return filteredNodes<ModifierDefinition>(m_subNodes); }
499-
std::vector<FunctionDefinition const*> definedFunctions() const { return filteredNodes<FunctionDefinition>(m_subNodes); }
502+
auto definedFunctions() const {
503+
return definedFunctionsByName() | ranges::views::transform([](auto const& _item) { return _item.second; });
504+
}
505+
auto definedFunctions(std::string const& _name) const {
506+
auto&& [b, e] = definedFunctionsByName().equal_range(_name);
507+
return ranges::span<decltype(*b)>(b, e) | ranges::views::transform([](auto const& _item) { return _item.second; });
508+
}
500509
std::vector<EventDefinition const*> events() const { return filteredNodes<EventDefinition>(m_subNodes); }
501510
std::vector<EventDefinition const*> const& interfaceEvents() const;
502511
/// @returns all errors defined in this contract or any base contract
@@ -546,13 +555,16 @@ class ContractDefinition: public Declaration, public StructurallyDocumented, pub
546555
FunctionDefinition const* nextConstructor(ContractDefinition const& _mostDerivedContract) const;
547556

548557
private:
558+
std::multimap<std::string, FunctionDefinition const*> const& definedFunctionsByName() const;
559+
549560
std::vector<ASTPointer<InheritanceSpecifier>> m_baseContracts;
550561
std::vector<ASTPointer<ASTNode>> m_subNodes;
551562
ContractKind m_contractKind;
552563
bool m_abstract{false};
553564

554565
util::LazyInit<std::vector<std::pair<util::FixedHash<4>, FunctionTypePointer>>> m_interfaceFunctionList[2];
555566
util::LazyInit<std::vector<EventDefinition const*>> m_interfaceEvents;
567+
util::LazyInit<std::multimap<std::string, FunctionDefinition const*>> m_definedFunctionsByName;
556568
};
557569

558570
/**

0 commit comments

Comments
 (0)