aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorchriseth <c@ethdev.com>2015-03-16 23:15:13 +0800
committerchriseth <c@ethdev.com>2015-03-18 01:13:27 +0800
commit895c08342c4b236c2928a5af9fb23def218eca3d (patch)
tree8def3be200aa9c7b740dfd98ba48e3c7a961817c
parented757ba5bf1090ba8a9a5e3e6a29da8785afb861 (diff)
downloaddexon-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.cpp17
-rw-r--r--Types.cpp26
-rw-r--r--Types.h4
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)
diff --git a/Types.cpp b/Types.cpp
index 04f86b92..ed3cb8fd 100644
--- a/Types.cpp
+++ b/Types.cpp
@@ -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();
diff --git a/Types.h b/Types.h
index e7601fde..c7dbcdeb 100644
--- a/Types.h
+++ b/Types.h
@@ -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