From 154002cda05a75203b625d23ce507787bd5fa5e4 Mon Sep 17 00:00:00 2001 From: chriseth Date: Wed, 14 Jun 2017 00:07:13 +0200 Subject: Move "active variable" to analysis phase. --- libsolidity/inlineasm/AsmAnalysis.cpp | 8 ++++---- libsolidity/inlineasm/AsmAnalysis.h | 8 +++++--- libsolidity/inlineasm/AsmScope.h | 10 +--------- 3 files changed, 10 insertions(+), 16 deletions(-) (limited to 'libsolidity/inlineasm') diff --git a/libsolidity/inlineasm/AsmAnalysis.cpp b/libsolidity/inlineasm/AsmAnalysis.cpp index 13852880..bb30fce1 100644 --- a/libsolidity/inlineasm/AsmAnalysis.cpp +++ b/libsolidity/inlineasm/AsmAnalysis.cpp @@ -91,7 +91,7 @@ bool AsmAnalyzer::operator()(assembly::Identifier const& _identifier) if (m_currentScope->lookup(_identifier.name, Scope::Visitor( [&](Scope::Variable const& _var) { - if (!_var.active) + if (!m_activeVariables.count(&_var)) { m_errorReporter.declarationError( _identifier.location, @@ -185,7 +185,7 @@ bool AsmAnalyzer::operator()(assembly::VariableDeclaration const& _varDecl) for (auto const& variable: _varDecl.variables) { expectValidType(variable.type, variable.location); - boost::get(m_currentScope->identifiers.at(variable.name)).active = true; + m_activeVariables.insert(&boost::get(m_currentScope->identifiers.at(variable.name))); } m_info.stackHeightInfo[&_varDecl] = m_stackHeight; return success; @@ -199,7 +199,7 @@ bool AsmAnalyzer::operator()(assembly::FunctionDefinition const& _funDef) for (auto const& var: _funDef.arguments + _funDef.returns) { expectValidType(var.type, var.location); - boost::get(varScope.identifiers.at(var.name)).active = true; + m_activeVariables.insert(&boost::get(varScope.identifiers.at(var.name))); } int const stackHeight = m_stackHeight; @@ -382,7 +382,7 @@ bool AsmAnalyzer::checkAssignment(assembly::Identifier const& _variable, size_t m_errorReporter.typeError(_variable.location, "Assignment requires variable."); success = false; } - else if (!boost::get(*var).active) + else if (!m_activeVariables.count(&boost::get(*var))) { m_errorReporter.declarationError( _variable.location, diff --git a/libsolidity/inlineasm/AsmAnalysis.h b/libsolidity/inlineasm/AsmAnalysis.h index e7748bcf..cd195d97 100644 --- a/libsolidity/inlineasm/AsmAnalysis.h +++ b/libsolidity/inlineasm/AsmAnalysis.h @@ -22,6 +22,8 @@ #include +#include + #include #include @@ -51,9 +53,6 @@ struct FunctionCall; struct Switch; using Statement = boost::variant; - -struct Scope; - struct AsmAnalysisInfo; /** @@ -101,6 +100,9 @@ private: int m_stackHeight = 0; julia::ExternalIdentifierAccess::Resolver m_resolver; Scope* m_currentScope = nullptr; + /// Variables that are active at the current point in assembly (as opposed to + /// "part of the scope but not yet declared") + std::set m_activeVariables; AsmAnalysisInfo& m_info; ErrorReporter& m_errorReporter; bool m_julia = false; diff --git a/libsolidity/inlineasm/AsmScope.h b/libsolidity/inlineasm/AsmScope.h index c8e38c8a..de9119e0 100644 --- a/libsolidity/inlineasm/AsmScope.h +++ b/libsolidity/inlineasm/AsmScope.h @@ -65,16 +65,8 @@ struct Scope using JuliaType = std::string; using LabelID = size_t; - struct Variable - { - /// Used during analysis to check whether we already passed the declaration inside the block. - /// @todo move there. - bool active = false; - JuliaType type; - }; - + struct Variable { JuliaType type; }; struct Label { }; - struct Function { std::vector arguments; -- cgit v1.2.3