aboutsummaryrefslogtreecommitdiffstats
path: root/libsolidity/analysis/ReferencesResolver.cpp
diff options
context:
space:
mode:
authorchriseth <chris@ethereum.org>2017-04-22 01:13:46 +0800
committerchriseth <chris@ethereum.org>2017-04-25 22:49:04 +0800
commit478f2997ea8b233882d33e693a0e8df176a0c222 (patch)
tree2e18e560a737d85048d08884482426f439235eea /libsolidity/analysis/ReferencesResolver.cpp
parent5f4b68e211a10af513d53cd2b9586191e174423d (diff)
downloaddexon-solidity-478f2997ea8b233882d33e693a0e8df176a0c222.tar
dexon-solidity-478f2997ea8b233882d33e693a0e8df176a0c222.tar.gz
dexon-solidity-478f2997ea8b233882d33e693a0e8df176a0c222.tar.bz2
dexon-solidity-478f2997ea8b233882d33e693a0e8df176a0c222.tar.lz
dexon-solidity-478f2997ea8b233882d33e693a0e8df176a0c222.tar.xz
dexon-solidity-478f2997ea8b233882d33e693a0e8df176a0c222.tar.zst
dexon-solidity-478f2997ea8b233882d33e693a0e8df176a0c222.zip
Storage access from inline assembly.
Diffstat (limited to 'libsolidity/analysis/ReferencesResolver.cpp')
-rw-r--r--libsolidity/analysis/ReferencesResolver.cpp20
1 files changed, 19 insertions, 1 deletions
diff --git a/libsolidity/analysis/ReferencesResolver.cpp b/libsolidity/analysis/ReferencesResolver.cpp
index a50fc6a0..2b40b4fd 100644
--- a/libsolidity/analysis/ReferencesResolver.cpp
+++ b/libsolidity/analysis/ReferencesResolver.cpp
@@ -28,6 +28,8 @@
#include <libsolidity/inlineasm/AsmAnalysis.h>
#include <libsolidity/inlineasm/AsmData.h>
+#include <boost/algorithm/string.hpp>
+
using namespace std;
using namespace dev;
using namespace dev::solidity;
@@ -166,10 +168,26 @@ bool ReferencesResolver::visit(InlineAssembly const& _inlineAssembly)
assembly::ExternalIdentifierAccess::Resolver resolver =
[&](assembly::Identifier const& _identifier, assembly::IdentifierContext) {
auto declarations = m_resolver.nameFromCurrentScope(_identifier.name);
+ bool isSlot = boost::algorithm::ends_with(_identifier.name, "_slot");
+ bool isOffset = boost::algorithm::ends_with(_identifier.name, "_offset");
+ if (isSlot || isOffset)
+ {
+ // special mode to access storage variables
+ if (!declarations.empty())
+ // the special identifier exists itself, we should not allow that.
+ return size_t(-1);
+ string realName = _identifier.name.substr(0,
+ _identifier.name.size() - isSlot ?
+ string("_slot").size() :
+ string("_offset").size()
+ );
+ declarations = m_resolver.nameFromCurrentScope(realName);
+ }
if (declarations.size() != 1)
return size_t(-1);
+ _inlineAssembly.annotation().externalReferences[&_identifier].isSlot = isSlot;
+ _inlineAssembly.annotation().externalReferences[&_identifier].isOffset = isOffset;
_inlineAssembly.annotation().externalReferences[&_identifier].declaration = declarations.front();
- // At this stage we do not yet know the stack size of the identifier, so we just return 1.
return size_t(1);
};
assembly::AsmAnalyzer::Scopes scopes;