diff options
author | chriseth <chris@ethereum.org> | 2017-04-22 01:13:46 +0800 |
---|---|---|
committer | chriseth <chris@ethereum.org> | 2017-04-25 22:49:04 +0800 |
commit | 478f2997ea8b233882d33e693a0e8df176a0c222 (patch) | |
tree | 2e18e560a737d85048d08884482426f439235eea /libsolidity/analysis/ReferencesResolver.cpp | |
parent | 5f4b68e211a10af513d53cd2b9586191e174423d (diff) | |
download | dexon-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.cpp | 20 |
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; |