aboutsummaryrefslogtreecommitdiffstats
path: root/libsolidity/analysis/ReferencesResolver.cpp
diff options
context:
space:
mode:
authorchriseth <c@ethdev.com>2016-03-02 05:56:39 +0800
committerchriseth <c@ethdev.com>2016-03-30 08:37:00 +0800
commitf0494307232e52dcc268f5f32d26cc89d7e98e3a (patch)
tree5a03eae3515eb50d67388e7d7d1193d016baaddf /libsolidity/analysis/ReferencesResolver.cpp
parent949b00ed591303c531ed8fa73087b710b7a554de (diff)
downloaddexon-solidity-f0494307232e52dcc268f5f32d26cc89d7e98e3a.tar
dexon-solidity-f0494307232e52dcc268f5f32d26cc89d7e98e3a.tar.gz
dexon-solidity-f0494307232e52dcc268f5f32d26cc89d7e98e3a.tar.bz2
dexon-solidity-f0494307232e52dcc268f5f32d26cc89d7e98e3a.tar.lz
dexon-solidity-f0494307232e52dcc268f5f32d26cc89d7e98e3a.tar.xz
dexon-solidity-f0494307232e52dcc268f5f32d26cc89d7e98e3a.tar.zst
dexon-solidity-f0494307232e52dcc268f5f32d26cc89d7e98e3a.zip
Code generation (missing external access and source locations).
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;