From 6d710920c5e6cd6a1a337eec66e149da3fd119b9 Mon Sep 17 00:00:00 2001 From: wechman Date: Tue, 30 Aug 2022 09:46:55 +0200 Subject: [PATCH] CFGNode stores function definition --- libsolidity/analysis/ControlFlowBuilder.cpp | 10 ++++------ libsolidity/analysis/ControlFlowGraph.cpp | 8 +------- libsolidity/analysis/ControlFlowGraph.h | 10 ++-------- libsolidity/analysis/ControlFlowRevertPruner.cpp | 4 ++-- 4 files changed, 9 insertions(+), 23 deletions(-) diff --git a/libsolidity/analysis/ControlFlowBuilder.cpp b/libsolidity/analysis/ControlFlowBuilder.cpp index e97520f16..d660318ed 100644 --- a/libsolidity/analysis/ControlFlowBuilder.cpp +++ b/libsolidity/analysis/ControlFlowBuilder.cpp @@ -81,8 +81,8 @@ bool ControlFlowBuilder::visit(BinaryOperation const& _operation) _operation.leftExpression().accept(*this); _operation.rightExpression().accept(*this); - solAssert(!m_currentNode->resolveFunctionCall(nullptr)); - m_currentNode->functionCall = _operation.annotation().userDefinedFunction; + m_currentNode->functionDefinition = _operation.annotation().userDefinedFunction; + auto nextNode = newLabel(); connect(m_currentNode, nextNode); @@ -102,8 +102,7 @@ bool ControlFlowBuilder::visit(UnaryOperation const& _operation) if (_operation.annotation().userDefinedFunction) { visitNode(_operation); - solAssert(!m_currentNode->resolveFunctionCall(nullptr)); - m_currentNode->functionCall = _operation.annotation().userDefinedFunction; + m_currentNode->functionDefinition = _operation.annotation().userDefinedFunction; auto nextNode = newLabel(); @@ -338,8 +337,7 @@ bool ControlFlowBuilder::visit(FunctionCall const& _functionCall) _functionCall.expression().accept(*this); ASTNode::listAccept(_functionCall.arguments(), *this); - solAssert(!m_currentNode->resolveFunctionCall(nullptr)); - m_currentNode->functionCall = &_functionCall; + m_currentNode->functionDefinition = ASTNode::resolveFunctionCall(_functionCall, m_contract); auto nextNode = newLabel(); diff --git a/libsolidity/analysis/ControlFlowGraph.cpp b/libsolidity/analysis/ControlFlowGraph.cpp index 1df7b1f4b..3dcfef90b 100644 --- a/libsolidity/analysis/ControlFlowGraph.cpp +++ b/libsolidity/analysis/ControlFlowGraph.cpp @@ -26,13 +26,7 @@ using namespace solidity::util; using namespace solidity::langutil; using namespace solidity::frontend; -FunctionDefinition const* CFGNode::resolveFunctionCall(ContractDefinition const* _mostDerivedContract) const -{ - return std::visit(GenericVisitor{ - [=](FunctionCall const* _call) { return _call ? ASTNode::resolveFunctionCall(*_call, _mostDerivedContract) : nullptr; }, - [](FunctionDefinition const* _definition) { return _definition; } - }, functionCall); -} + bool CFG::constructFlow(ASTNode const& _astRoot) { diff --git a/libsolidity/analysis/ControlFlowGraph.h b/libsolidity/analysis/ControlFlowGraph.h index 68f15a30d..7419e6910 100644 --- a/libsolidity/analysis/ControlFlowGraph.h +++ b/libsolidity/analysis/ControlFlowGraph.h @@ -99,14 +99,8 @@ struct CFGNode std::vector entries; /// Exit nodes. All CFG nodes to which control flow may continue after this node. std::vector exits; - /// Function call done by this node, either a proper function call (allows virtual lookup) - /// or a direct function definition reference (in case of an operator), - /// or nullptr. - std::variant functionCall = static_cast(nullptr); - /// @returns the actual function called given a most derived contract. If no function is called - /// in this node, returns nullptr. - FunctionDefinition const* resolveFunctionCall(ContractDefinition const* _mostDerivedContract) const; - + /// Function call done by this node + FunctionDefinition const* functionDefinition; /// Variable occurrences in the node. std::vector variableOccurrences; // Source location of this control flow block. diff --git a/libsolidity/analysis/ControlFlowRevertPruner.cpp b/libsolidity/analysis/ControlFlowRevertPruner.cpp index b42bb3b8a..a80e963e4 100644 --- a/libsolidity/analysis/ControlFlowRevertPruner.cpp +++ b/libsolidity/analysis/ControlFlowRevertPruner.cpp @@ -81,7 +81,7 @@ void ControlFlowRevertPruner::findRevertStates() if (_node == functionFlow.exit) foundExit = true; - auto const* resolvedFunction = _node->resolveFunctionCall(item.contract); + auto const* resolvedFunction = _node->functionDefinition;; if (resolvedFunction && resolvedFunction->isImplemented()) { CFG::FunctionContractTuple calledFunctionTuple{ @@ -131,7 +131,7 @@ void ControlFlowRevertPruner::modifyFunctionFlows() FunctionFlow const& functionFlow = m_cfg.functionFlow(*item.first.function, item.first.contract); solidity::util::BreadthFirstSearch{{functionFlow.entry}}.run( [&](CFGNode* _node, auto&& _addChild) { - auto const* resolvedFunction = _node->resolveFunctionCall(item.first.contract); + auto const* resolvedFunction = _node->functionDefinition; if (resolvedFunction && resolvedFunction->isImplemented()) switch (m_functions.at({findScopeContract(*resolvedFunction, item.first.contract), resolvedFunction})) {