diff options
Diffstat (limited to 'libsolidity/codegen')
-rw-r--r-- | libsolidity/codegen/ABIFunctions.cpp | 1 | ||||
-rw-r--r-- | libsolidity/codegen/ABIFunctions.h | 7 | ||||
-rw-r--r-- | libsolidity/codegen/ArrayUtils.cpp | 8 | ||||
-rw-r--r-- | libsolidity/codegen/AsmCodeGen.h | 2 | ||||
-rw-r--r-- | libsolidity/codegen/Compiler.cpp | 3 | ||||
-rw-r--r-- | libsolidity/codegen/Compiler.h | 4 | ||||
-rw-r--r-- | libsolidity/codegen/CompilerContext.cpp | 11 | ||||
-rw-r--r-- | libsolidity/codegen/CompilerContext.h | 13 | ||||
-rw-r--r-- | libsolidity/codegen/CompilerUtils.cpp | 4 | ||||
-rw-r--r-- | libsolidity/codegen/CompilerUtils.h | 2 | ||||
-rw-r--r-- | libsolidity/codegen/ContractCompiler.cpp | 60 | ||||
-rw-r--r-- | libsolidity/codegen/ContractCompiler.h | 4 | ||||
-rw-r--r-- | libsolidity/codegen/ExpressionCompiler.cpp | 18 | ||||
-rw-r--r-- | libsolidity/codegen/ExpressionCompiler.h | 11 | ||||
-rw-r--r-- | libsolidity/codegen/LValue.cpp | 5 | ||||
-rw-r--r-- | libsolidity/codegen/LValue.h | 4 |
16 files changed, 93 insertions, 64 deletions
diff --git a/libsolidity/codegen/ABIFunctions.cpp b/libsolidity/codegen/ABIFunctions.cpp index 5000131c..c1ab03e3 100644 --- a/libsolidity/codegen/ABIFunctions.cpp +++ b/libsolidity/codegen/ABIFunctions.cpp @@ -24,7 +24,6 @@ #include <libsolidity/ast/AST.h> #include <libsolidity/codegen/CompilerUtils.h> - #include <libdevcore/Whiskers.h> #include <boost/algorithm/string/join.hpp> diff --git a/libsolidity/codegen/ABIFunctions.h b/libsolidity/codegen/ABIFunctions.h index d2132258..1e0cf7fa 100644 --- a/libsolidity/codegen/ABIFunctions.h +++ b/libsolidity/codegen/ABIFunctions.h @@ -22,14 +22,13 @@ #pragma once -#include <liblangutil/EVMVersion.h> - #include <libsolidity/ast/ASTForward.h> +#include <liblangutil/EVMVersion.h> -#include <vector> #include <functional> -#include <set> #include <map> +#include <set> +#include <vector> namespace dev { namespace solidity { diff --git a/libsolidity/codegen/ArrayUtils.cpp b/libsolidity/codegen/ArrayUtils.cpp index 4878f9f3..f9678f7c 100644 --- a/libsolidity/codegen/ArrayUtils.cpp +++ b/libsolidity/codegen/ArrayUtils.cpp @@ -21,13 +21,15 @@ */ #include <libsolidity/codegen/ArrayUtils.h> -#include <libevmasm/Instruction.h> + +#include <libsolidity/ast/Types.h> #include <libsolidity/codegen/CompilerContext.h> #include <libsolidity/codegen/CompilerUtils.h> -#include <libsolidity/ast/Types.h> -#include <liblangutil/Exceptions.h> #include <libsolidity/codegen/LValue.h> +#include <libevmasm/Instruction.h> +#include <liblangutil/Exceptions.h> + using namespace std; using namespace dev; using namespace langutil; diff --git a/libsolidity/codegen/AsmCodeGen.h b/libsolidity/codegen/AsmCodeGen.h index 303d32ee..516b0a36 100644 --- a/libsolidity/codegen/AsmCodeGen.h +++ b/libsolidity/codegen/AsmCodeGen.h @@ -22,9 +22,7 @@ #include <libyul/AsmAnalysis.h> #include <libyul/backends/evm/AbstractAssembly.h> - #include <liblangutil/SourceLocation.h> - #include <functional> namespace yul diff --git a/libsolidity/codegen/Compiler.cpp b/libsolidity/codegen/Compiler.cpp index fe57cff6..a22e6e9d 100644 --- a/libsolidity/codegen/Compiler.cpp +++ b/libsolidity/codegen/Compiler.cpp @@ -21,8 +21,9 @@ */ #include <libsolidity/codegen/Compiler.h> -#include <libevmasm/Assembly.h> + #include <libsolidity/codegen/ContractCompiler.h> +#include <libevmasm/Assembly.h> using namespace std; using namespace dev; diff --git a/libsolidity/codegen/Compiler.h b/libsolidity/codegen/Compiler.h index 48d9e9d6..784d7f8c 100644 --- a/libsolidity/codegen/Compiler.h +++ b/libsolidity/codegen/Compiler.h @@ -24,11 +24,9 @@ #include <libsolidity/codegen/CompilerContext.h> #include <liblangutil/EVMVersion.h> - #include <libevmasm/Assembly.h> - -#include <ostream> #include <functional> +#include <ostream> namespace dev { namespace solidity { diff --git a/libsolidity/codegen/CompilerContext.cpp b/libsolidity/codegen/CompilerContext.cpp index 0b018e1e..be681b2e 100644 --- a/libsolidity/codegen/CompilerContext.cpp +++ b/libsolidity/codegen/CompilerContext.cpp @@ -21,19 +21,22 @@ */ #include <libsolidity/codegen/CompilerContext.h> -#include <libsolidity/codegen/CompilerUtils.h> + #include <libsolidity/ast/AST.h> -#include <libsolidity/codegen/Compiler.h> #include <libsolidity/codegen/AsmCodeGen.h> +#include <libsolidity/codegen/Compiler.h> +#include <libsolidity/codegen/CompilerUtils.h> #include <libsolidity/interface/Version.h> -#include <liblangutil/SourceReferenceFormatter.h> + #include <libyul/AsmParser.h> #include <libyul/AsmAnalysis.h> #include <libyul/AsmAnalysisInfo.h> -#include <libyul/YulString.h> #include <libyul/backends/evm/EVMDialect.h> +#include <libyul/YulString.h> + #include <liblangutil/ErrorReporter.h> #include <liblangutil/Scanner.h> +#include <liblangutil/SourceReferenceFormatter.h> #include <boost/algorithm/string/replace.hpp> diff --git a/libsolidity/codegen/CompilerContext.h b/libsolidity/codegen/CompilerContext.h index 02369813..dedcd95f 100644 --- a/libsolidity/codegen/CompilerContext.h +++ b/libsolidity/codegen/CompilerContext.h @@ -22,24 +22,21 @@ #pragma once -#include <libsolidity/codegen/ABIFunctions.h> - -#include <liblangutil/EVMVersion.h> - +#include <libsolidity/ast/ASTAnnotations.h> #include <libsolidity/ast/ASTForward.h> #include <libsolidity/ast/Types.h> -#include <libsolidity/ast/ASTAnnotations.h> +#include <libsolidity/codegen/ABIFunctions.h> -#include <libevmasm/Instruction.h> #include <libevmasm/Assembly.h> - +#include <libevmasm/Instruction.h> +#include <liblangutil/EVMVersion.h> #include <libdevcore/Common.h> +#include <functional> #include <ostream> #include <stack> #include <queue> #include <utility> -#include <functional> namespace dev { namespace solidity { diff --git a/libsolidity/codegen/CompilerUtils.cpp b/libsolidity/codegen/CompilerUtils.cpp index 259f1620..bbc703c7 100644 --- a/libsolidity/codegen/CompilerUtils.cpp +++ b/libsolidity/codegen/CompilerUtils.cpp @@ -23,12 +23,10 @@ #include <libsolidity/codegen/CompilerUtils.h> #include <libsolidity/ast/AST.h> +#include <libsolidity/codegen/ABIFunctions.h> #include <libsolidity/codegen/ArrayUtils.h> #include <libsolidity/codegen/LValue.h> -#include <libsolidity/codegen/ABIFunctions.h> - #include <libevmasm/Instruction.h> - #include <libdevcore/Whiskers.h> using namespace std; diff --git a/libsolidity/codegen/CompilerUtils.h b/libsolidity/codegen/CompilerUtils.h index 5f7dce22..7e4f47ba 100644 --- a/libsolidity/codegen/CompilerUtils.h +++ b/libsolidity/codegen/CompilerUtils.h @@ -22,8 +22,8 @@ #pragma once -#include <libsolidity/codegen/CompilerContext.h> #include <libsolidity/ast/ASTForward.h> +#include <libsolidity/codegen/CompilerContext.h> namespace dev { namespace solidity { diff --git a/libsolidity/codegen/ContractCompiler.cpp b/libsolidity/codegen/ContractCompiler.cpp index 67876721..b051d260 100644 --- a/libsolidity/codegen/ContractCompiler.cpp +++ b/libsolidity/codegen/ContractCompiler.cpp @@ -20,19 +20,18 @@ * Solidity compiler. */ +#include <libsolidity/ast/AST.h> +#include <libsolidity/codegen/AsmCodeGen.h> +#include <libsolidity/codegen/CompilerUtils.h> #include <libsolidity/codegen/ContractCompiler.h> #include <libsolidity/codegen/ExpressionCompiler.h> -#include <libsolidity/codegen/CompilerUtils.h> -#include <libsolidity/codegen/AsmCodeGen.h> -#include <libsolidity/ast/AST.h> -#include <liblangutil/ErrorReporter.h> #include <libevmasm/Instruction.h> #include <libevmasm/Assembly.h> #include <libevmasm/GasMeter.h> +#include <liblangutil/ErrorReporter.h> #include <boost/range/adaptor/reversed.hpp> - #include <algorithm> using namespace std; @@ -332,6 +331,25 @@ void ContractCompiler::appendInternalSelector( } } +namespace +{ + +// Helper function to check if any function is payable +bool hasPayableFunctions(ContractDefinition const& _contract) +{ + FunctionDefinition const* fallback = _contract.fallbackFunction(); + if (fallback && fallback->isPayable()) + return true; + + for (auto const& it: _contract.interfaceFunctions()) + if (it.second->isPayable()) + return true; + + return false; +} + +} + void ContractCompiler::appendFunctionSelector(ContractDefinition const& _contract) { map<FixedHash<4>, FunctionTypePointer> interfaceFunctions = _contract.interfaceFunctions(); @@ -343,6 +361,15 @@ void ContractCompiler::appendFunctionSelector(ContractDefinition const& _contrac } FunctionDefinition const* fallback = _contract.fallbackFunction(); + solAssert(!_contract.isLibrary() || !fallback, "Libraries can't have fallback functions"); + + bool needToAddCallvalueCheck = true; + if (!hasPayableFunctions(_contract) && !interfaceFunctions.empty() && !_contract.isLibrary()) + { + appendCallValueCheck(); + needToAddCallvalueCheck = false; + } + eth::AssemblyItem notFound = m_context.newTag(); // directly jump to fallback if the data is too short to contain a function selector // also guards against short data @@ -351,23 +378,26 @@ void ContractCompiler::appendFunctionSelector(ContractDefinition const& _contrac // retrieve the function signature hash from the calldata if (!interfaceFunctions.empty()) + { CompilerUtils(m_context).loadFromMemory(0, IntegerType(CompilerUtils::dataStartOffset * 8), true); - // stack now is: <can-call-non-view-functions>? <funhash> - vector<FixedHash<4>> sortedIDs; - for (auto const& it: interfaceFunctions) - { - callDataUnpackerEntryPoints.insert(std::make_pair(it.first, m_context.newTag())); - sortedIDs.emplace_back(it.first); + // stack now is: <can-call-non-view-functions>? <funhash> + vector<FixedHash<4>> sortedIDs; + for (auto const& it: interfaceFunctions) + { + callDataUnpackerEntryPoints.emplace(it.first, m_context.newTag()); + sortedIDs.emplace_back(it.first); + } + std::sort(sortedIDs.begin(), sortedIDs.end()); + appendInternalSelector(callDataUnpackerEntryPoints, sortedIDs, notFound, m_optimise_runs); } - std::sort(sortedIDs.begin(), sortedIDs.end()); - appendInternalSelector(callDataUnpackerEntryPoints, sortedIDs, notFound, m_optimise_runs); m_context << notFound; + if (fallback) { solAssert(!_contract.isLibrary(), ""); - if (!fallback->isPayable()) + if (!fallback->isPayable() && needToAddCallvalueCheck) appendCallValueCheck(); solAssert(fallback->isFallback(), ""); @@ -397,7 +427,7 @@ void ContractCompiler::appendFunctionSelector(ContractDefinition const& _contrac m_context.setStackOffset(0); // We have to allow this for libraries, because value of the previous // call is still visible in the delegatecall. - if (!functionType->isPayable() && !_contract.isLibrary()) + if (!functionType->isPayable() && !_contract.isLibrary() && needToAddCallvalueCheck) appendCallValueCheck(); // Return tag is used to jump out of the function. diff --git a/libsolidity/codegen/ContractCompiler.h b/libsolidity/codegen/ContractCompiler.h index 266ace0b..40871f0d 100644 --- a/libsolidity/codegen/ContractCompiler.h +++ b/libsolidity/codegen/ContractCompiler.h @@ -22,11 +22,11 @@ #pragma once -#include <ostream> -#include <functional> #include <libsolidity/ast/ASTVisitor.h> #include <libsolidity/codegen/CompilerContext.h> #include <libevmasm/Assembly.h> +#include <functional> +#include <ostream> namespace dev { namespace solidity { diff --git a/libsolidity/codegen/ExpressionCompiler.cpp b/libsolidity/codegen/ExpressionCompiler.cpp index 121585d9..46359f2b 100644 --- a/libsolidity/codegen/ExpressionCompiler.cpp +++ b/libsolidity/codegen/ExpressionCompiler.cpp @@ -20,21 +20,23 @@ * Solidity AST to EVM bytecode compiler for expressions. */ -#include <utility> -#include <numeric> -#include <boost/range/adaptor/reversed.hpp> -#include <boost/algorithm/string/replace.hpp> -#include <libdevcore/Common.h> -#include <libdevcore/Keccak256.h> -#include <libsolidity/ast/AST.h> #include <libsolidity/codegen/ExpressionCompiler.h> + +#include <libsolidity/ast/AST.h> #include <libsolidity/codegen/CompilerContext.h> #include <libsolidity/codegen/CompilerUtils.h> #include <libsolidity/codegen/LValue.h> -#include <libevmasm/GasMeter.h> +#include <libevmasm/GasMeter.h> +#include <libdevcore/Common.h> +#include <libdevcore/Keccak256.h> #include <libdevcore/Whiskers.h> +#include <boost/algorithm/string/replace.hpp> +#include <boost/range/adaptor/reversed.hpp> +#include <numeric> +#include <utility> + using namespace std; using namespace langutil; diff --git a/libsolidity/codegen/ExpressionCompiler.h b/libsolidity/codegen/ExpressionCompiler.h index e9345ece..4a6e43ff 100644 --- a/libsolidity/codegen/ExpressionCompiler.h +++ b/libsolidity/codegen/ExpressionCompiler.h @@ -23,14 +23,15 @@ #pragma once -#include <functional> -#include <memory> -#include <boost/noncopyable.hpp> -#include <libdevcore/Common.h> -#include <liblangutil/SourceLocation.h> #include <libsolidity/ast/ASTVisitor.h> #include <libsolidity/codegen/LValue.h> #include <liblangutil/Exceptions.h> +#include <liblangutil/SourceLocation.h> +#include <libdevcore/Common.h> + +#include <boost/noncopyable.hpp> +#include <functional> +#include <memory> namespace dev { namespace eth diff --git a/libsolidity/codegen/LValue.cpp b/libsolidity/codegen/LValue.cpp index 6d71d36f..70dbee81 100644 --- a/libsolidity/codegen/LValue.cpp +++ b/libsolidity/codegen/LValue.cpp @@ -21,10 +21,11 @@ */ #include <libsolidity/codegen/LValue.h> -#include <libevmasm/Instruction.h> -#include <libsolidity/ast/Types.h> + #include <libsolidity/ast/AST.h> +#include <libsolidity/ast/Types.h> #include <libsolidity/codegen/CompilerUtils.h> +#include <libevmasm/Instruction.h> using namespace std; using namespace dev; diff --git a/libsolidity/codegen/LValue.h b/libsolidity/codegen/LValue.h index d854857b..3b44597f 100644 --- a/libsolidity/codegen/LValue.h +++ b/libsolidity/codegen/LValue.h @@ -22,10 +22,10 @@ #pragma once +#include <libsolidity/codegen/ArrayUtils.h> +#include <liblangutil/SourceLocation.h> #include <memory> #include <vector> -#include <liblangutil/SourceLocation.h> -#include <libsolidity/codegen/ArrayUtils.h> namespace dev { |