diff --git a/libsolidity/analysis/FunctionCallGraph.cpp b/libsolidity/analysis/FunctionCallGraph.cpp index 864c159c0..d7fc46999 100644 --- a/libsolidity/analysis/FunctionCallGraph.cpp +++ b/libsolidity/analysis/FunctionCallGraph.cpp @@ -177,18 +177,13 @@ void FunctionCallGraphBuilder::endVisit(ModifierInvocation const& _modifierInvoc } } -void FunctionCallGraphBuilder::visitCallable(CallableDeclaration const* _callable, bool _directCall) +void FunctionCallGraphBuilder::visitCallable(CallableDeclaration const* _callable) { solAssert(!m_graph->edges.count(_callable), ""); optional previousNode = m_currentNode; m_currentNode = _callable; - if (previousNode.has_value() && _directCall) - add(*previousNode, _callable); - if (!_directCall) - add(*m_currentNode, m_currentDispatch); - _callable->accept(*this); m_currentNode = previousNode; @@ -201,12 +196,16 @@ bool FunctionCallGraphBuilder::add(Node _caller, Node _callee) void FunctionCallGraphBuilder::processFunction(CallableDeclaration const& _callable, bool _calledDirectly) { - if (m_graph->edges.count(&_callable)) - return; + if (m_currentNode.has_value() && _calledDirectly) + add(*m_currentNode, &_callable); - // Create edge to creation dispatch if (!_calledDirectly) + { add(m_currentDispatch, &_callable); - visitCallable(&_callable, _calledDirectly); + add(&_callable, m_currentDispatch); + } + + if (!m_graph->edges.count(&_callable)) + visitCallable(&_callable); } diff --git a/libsolidity/analysis/FunctionCallGraph.h b/libsolidity/analysis/FunctionCallGraph.h index 71254783f..1c4e79838 100644 --- a/libsolidity/analysis/FunctionCallGraph.h +++ b/libsolidity/analysis/FunctionCallGraph.h @@ -88,7 +88,7 @@ private: void endVisit(MemberAccess const& _memberAccess) override; void endVisit(ModifierInvocation const& _modifierInvocation) override; - void visitCallable(CallableDeclaration const* _callable, bool _directCall = true); + void visitCallable(CallableDeclaration const* _callable); bool add(Node _caller, Node _callee); void processFunction(CallableDeclaration const& _callable, bool _calledDirectly = true);