diff options
author | chriseth <c@ethdev.com> | 2015-03-16 23:15:13 +0800 |
---|---|---|
committer | chriseth <c@ethdev.com> | 2015-03-18 01:13:27 +0800 |
commit | 895c08342c4b236c2928a5af9fb23def218eca3d (patch) | |
tree | 8def3be200aa9c7b740dfd98ba48e3c7a961817c | |
parent | ed757ba5bf1090ba8a9a5e3e6a29da8785afb861 (diff) | |
download | dexon-solidity-895c08342c4b236c2928a5af9fb23def218eca3d.tar dexon-solidity-895c08342c4b236c2928a5af9fb23def218eca3d.tar.gz dexon-solidity-895c08342c4b236c2928a5af9fb23def218eca3d.tar.bz2 dexon-solidity-895c08342c4b236c2928a5af9fb23def218eca3d.tar.lz dexon-solidity-895c08342c4b236c2928a5af9fb23def218eca3d.tar.xz dexon-solidity-895c08342c4b236c2928a5af9fb23def218eca3d.tar.zst dexon-solidity-895c08342c4b236c2928a5af9fb23def218eca3d.zip |
Provide access to storage offsets via contract type.
-rw-r--r-- | Compiler.cpp | 17 | ||||
-rw-r--r-- | Types.cpp | 26 | ||||
-rw-r--r-- | Types.h | 4 |
3 files changed, 30 insertions, 17 deletions
diff --git a/Compiler.cpp b/Compiler.cpp index db61cc4a..8e263449 100644 --- a/Compiler.cpp +++ b/Compiler.cpp @@ -20,12 +20,12 @@ * Solidity compiler. */ +#include <libsolidity/Compiler.h> #include <algorithm> #include <boost/range/adaptor/reversed.hpp> #include <libevmcore/Instruction.h> #include <libevmcore/Assembly.h> #include <libsolidity/AST.h> -#include <libsolidity/Compiler.h> #include <libsolidity/ExpressionCompiler.h> #include <libsolidity/CompilerUtils.h> @@ -274,19 +274,8 @@ void Compiler::appendReturnValuePacker(TypePointers const& _typeParameters) void Compiler::registerStateVariables(ContractDefinition const& _contract) { - vector<VariableDeclaration const*> variables; - for (ContractDefinition const* contract: boost::adaptors::reverse(_contract.getLinearizedBaseContracts())) - for (ASTPointer<VariableDeclaration> const& variable: contract->getStateVariables()) - if (!variable->isConstant()) - variables.push_back(variable.get()); - TypePointers types; - for (auto variable: variables) - types.push_back(variable->getType()); - StorageOffsets offsets; - offsets.computeOffsets(types); - for (size_t index = 0; index < variables.size(); ++index) - if (auto const* offset = offsets.getOffset(index)) - m_context.addStateVariable(*variables[index], offset->first, offset->second); + for (auto const& var: ContractType(_contract).getStateVariables()) + m_context.addStateVariable(*get<0>(var), get<1>(var), get<2>(var)); } void Compiler::initializeStateVariables(ContractDefinition const& _contract) @@ -20,14 +20,14 @@ * Solidity data types */ +#include <libsolidity/Types.h> +#include <limits> +#include <boost/range/adaptor/reversed.hpp> #include <libdevcore/CommonIO.h> #include <libdevcore/CommonData.h> #include <libsolidity/Utils.h> -#include <libsolidity/Types.h> #include <libsolidity/AST.h> -#include <limits> - using namespace std; namespace dev @@ -812,6 +812,26 @@ u256 ContractType::getFunctionIdentifier(string const& _functionName) const return Invalid256; } +vector<tuple<VariableDeclaration const*, u256, unsigned>> ContractType::getStateVariables() const +{ + vector<VariableDeclaration const*> variables; + for (ContractDefinition const* contract: boost::adaptors::reverse(m_contract.getLinearizedBaseContracts())) + for (ASTPointer<VariableDeclaration> const& variable: contract->getStateVariables()) + if (!variable->isConstant()) + variables.push_back(variable.get()); + TypePointers types; + for (auto variable: variables) + types.push_back(variable->getType()); + StorageOffsets offsets; + offsets.computeOffsets(types); + + vector<tuple<VariableDeclaration const*, u256, unsigned>> variablesAndOffsets; + for (size_t index = 0; index < variables.size(); ++index) + if (auto const* offset = offsets.getOffset(index)) + variablesAndOffsets.push_back(make_tuple(variables[index], offset->first, offset->second)); + return variablesAndOffsets; +} + TypePointer StructType::unaryOperatorResult(Token::Value _operator) const { return _operator == Token::Delete ? make_shared<VoidType>() : TypePointer(); @@ -403,6 +403,10 @@ public: /// not exist. u256 getFunctionIdentifier(std::string const& _functionName) const; + /// @returns a list of all state variables (including inherited) of the contract and their + /// offsets in storage. + std::vector<std::tuple<VariableDeclaration const*, u256, unsigned>> getStateVariables() const; + private: ContractDefinition const& m_contract; /// If true, it is the "super" type of the current contract, i.e. it contains only inherited |