From 444e84412052397fc4a8f4fdcceb62b3ef65be2e Mon Sep 17 00:00:00 2001 From: Mathias Baumann Date: Tue, 1 Jun 2021 17:20:45 +0200 Subject: [PATCH] Cache calls to ``definedFunctions()`` --- libsolidity/ast/AST.cpp | 8 ++++++++ libsolidity/ast/AST.h | 3 ++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/libsolidity/ast/AST.cpp b/libsolidity/ast/AST.cpp index 537846007..2c218033e 100644 --- a/libsolidity/ast/AST.cpp +++ b/libsolidity/ast/AST.cpp @@ -149,6 +149,14 @@ FunctionDefinition const* ContractDefinition::receiveFunction() const return nullptr; } +std::vector const& ContractDefinition::definedFunctions() const +{ + if (!m_cachedDefinedFunctions) + m_cachedDefinedFunctions = filteredNodes(m_subNodes); + + return *m_cachedDefinedFunctions; +} + vector const& ContractDefinition::interfaceEvents() const { return m_interfaceEvents.init([&]{ diff --git a/libsolidity/ast/AST.h b/libsolidity/ast/AST.h index 7a1609e81..73cbb9d1d 100644 --- a/libsolidity/ast/AST.h +++ b/libsolidity/ast/AST.h @@ -496,7 +496,7 @@ public: std::vector definedEnums() const { return filteredNodes(m_subNodes); } std::vector stateVariables() const { return filteredNodes(m_subNodes); } std::vector functionModifiers() const { return filteredNodes(m_subNodes); } - std::vector definedFunctions() const { return filteredNodes(m_subNodes); } + std::vector const& definedFunctions() const; std::vector events() const { return filteredNodes(m_subNodes); } std::vector const& interfaceEvents() const; /// @returns all errors defined in this contract or any base contract @@ -549,6 +549,7 @@ private: std::vector> m_baseContracts; std::vector> m_subNodes; ContractKind m_contractKind; + mutable std::optional> m_cachedDefinedFunctions; bool m_abstract{false}; util::LazyInit, FunctionTypePointer>>> m_interfaceFunctionList[2];