aboutsummaryrefslogtreecommitdiffstats
path: root/libsolidity/analysis/ReferencesResolver.cpp
diff options
context:
space:
mode:
authorchriseth <c@ethdev.com>2016-03-30 20:42:05 +0800
committerchriseth <c@ethdev.com>2016-03-30 20:42:05 +0800
commit9ca29aa508a25b5ccd9261ab7fd441df27d7da5f (patch)
treedaca1d62b8253827bf8086dba3bd8679404a8660 /libsolidity/analysis/ReferencesResolver.cpp
parent8236732e9a5d2535afd3a3573a70d5aab3da3efe (diff)
parentb336f6261c2373cc769bcafb0466a251576f3fdd (diff)
downloaddexon-solidity-9ca29aa508a25b5ccd9261ab7fd441df27d7da5f.tar
dexon-solidity-9ca29aa508a25b5ccd9261ab7fd441df27d7da5f.tar.gz
dexon-solidity-9ca29aa508a25b5ccd9261ab7fd441df27d7da5f.tar.bz2
dexon-solidity-9ca29aa508a25b5ccd9261ab7fd441df27d7da5f.tar.lz
dexon-solidity-9ca29aa508a25b5ccd9261ab7fd441df27d7da5f.tar.xz
dexon-solidity-9ca29aa508a25b5ccd9261ab7fd441df27d7da5f.tar.zst
dexon-solidity-9ca29aa508a25b5ccd9261ab7fd441df27d7da5f.zip
Merge pull request #430 from chriseth/assembly
Inline Assembly
Diffstat (limited to 'libsolidity/analysis/ReferencesResolver.cpp')
-rw-r--r--libsolidity/analysis/ReferencesResolver.cpp22
1 files changed, 22 insertions, 0 deletions
diff --git a/libsolidity/analysis/ReferencesResolver.cpp b/libsolidity/analysis/ReferencesResolver.cpp
index ca002f58..d7542bf3 100644
--- a/libsolidity/analysis/ReferencesResolver.cpp
+++ b/libsolidity/analysis/ReferencesResolver.cpp
@@ -25,6 +25,8 @@
#include <libsolidity/analysis/NameAndTypeResolver.h>
#include <libsolidity/interface/Exceptions.h>
#include <libsolidity/analysis/ConstantEvaluator.h>
+#include <libsolidity/inlineasm/AsmCodeGen.h>
+#include <libsolidity/inlineasm/AsmData.h>
using namespace std;
using namespace dev;
@@ -112,6 +114,26 @@ void ReferencesResolver::endVisit(ArrayTypeName const& _typeName)
_typeName.annotation().type = make_shared<ArrayType>(DataLocation::Storage, baseType);
}
+bool ReferencesResolver::visit(InlineAssembly const& _inlineAssembly)
+{
+ // We need to perform a full code generation pass here as inline assembly does not distinguish
+ // reference resolution and code generation.
+ // Errors created in this stage are completely ignored because we do not yet know
+ // the type and size of external identifiers, which would result in false errors.
+ ErrorList errorsIgnored;
+ assembly::CodeGenerator codeGen(_inlineAssembly.operations(), errorsIgnored);
+ codeGen.typeCheck([&](assembly::Identifier const& _identifier, eth::Assembly&, assembly::CodeGenerator::IdentifierContext) {
+ auto declarations = m_resolver.nameFromCurrentScope(_identifier.name);
+ if (declarations.size() != 1)
+ return false;
+ _inlineAssembly.annotation().externalReferences[&_identifier] = declarations.front();
+ // At this stage we neither know the code to generate nor the stack size of the identifier,
+ // so we do not modify assembly.
+ return true;
+ });
+ return false;
+}
+
bool ReferencesResolver::visit(Return const& _return)
{
_return.annotation().functionReturnParameters = m_returnParameters;