diff options
author | chriseth <chris@ethereum.org> | 2017-06-14 20:12:33 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-06-14 20:12:33 +0800 |
commit | 43cfab70d0dfb7e5a6058ba2a84874f7622abb2f (patch) | |
tree | e93dd49913dfcde29c52a9c42bdcb9e0ae66bfa6 /libsolidity | |
parent | c99c1c76f7ce2963b1401b53676ca3bbb0eadbea (diff) | |
parent | 154002cda05a75203b625d23ce507787bd5fa5e4 (diff) | |
download | dexon-solidity-43cfab70d0dfb7e5a6058ba2a84874f7622abb2f.tar.gz dexon-solidity-43cfab70d0dfb7e5a6058ba2a84874f7622abb2f.tar.zst dexon-solidity-43cfab70d0dfb7e5a6058ba2a84874f7622abb2f.zip |
Merge pull request #2389 from ethereum/moveLabelIDs
Move LabelIDs to generation phase.
Diffstat (limited to 'libsolidity')
-rw-r--r-- | libsolidity/inlineasm/AsmAnalysis.cpp | 8 | ||||
-rw-r--r-- | libsolidity/inlineasm/AsmAnalysis.h | 8 | ||||
-rw-r--r-- | libsolidity/inlineasm/AsmScope.cpp | 2 | ||||
-rw-r--r-- | libsolidity/inlineasm/AsmScope.h | 19 |
4 files changed, 12 insertions, 25 deletions
diff --git a/libsolidity/inlineasm/AsmAnalysis.cpp b/libsolidity/inlineasm/AsmAnalysis.cpp index 36ac0e75..7bcbde91 100644 --- a/libsolidity/inlineasm/AsmAnalysis.cpp +++ b/libsolidity/inlineasm/AsmAnalysis.cpp @@ -92,7 +92,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, @@ -187,7 +187,7 @@ bool AsmAnalyzer::operator()(assembly::VariableDeclaration const& _varDecl) for (auto const& variable: _varDecl.variables) { expectValidType(variable.type, variable.location); - boost::get<Scope::Variable>(m_currentScope->identifiers.at(variable.name)).active = true; + m_activeVariables.insert(&boost::get<Scope::Variable>(m_currentScope->identifiers.at(variable.name))); } m_info.stackHeightInfo[&_varDecl] = m_stackHeight; return success; @@ -201,7 +201,7 @@ bool AsmAnalyzer::operator()(assembly::FunctionDefinition const& _funDef) for (auto const& var: _funDef.arguments + _funDef.returns) { expectValidType(var.type, var.location); - boost::get<Scope::Variable>(varScope.identifiers.at(var.name)).active = true; + m_activeVariables.insert(&boost::get<Scope::Variable>(varScope.identifiers.at(var.name))); } int const stackHeight = m_stackHeight; @@ -384,7 +384,7 @@ bool AsmAnalyzer::checkAssignment(assembly::Identifier const& _variable, size_t m_errorReporter.typeError(_variable.location, "Assignment requires variable."); success = false; } - else if (!boost::get<Scope::Variable>(*var).active) + else if (!m_activeVariables.count(&boost::get<Scope::Variable>(*var))) { m_errorReporter.declarationError( _variable.location, diff --git a/libsolidity/inlineasm/AsmAnalysis.h b/libsolidity/inlineasm/AsmAnalysis.h index 55b409ba..2516722a 100644 --- a/libsolidity/inlineasm/AsmAnalysis.h +++ b/libsolidity/inlineasm/AsmAnalysis.h @@ -22,6 +22,8 @@ #include <libsolidity/interface/Exceptions.h> +#include <libsolidity/inlineasm/AsmScope.h> + #include <libjulia/backends/evm/AbstractAssembly.h> #include <boost/variant.hpp> @@ -51,9 +53,6 @@ struct FunctionCall; struct Switch; using Statement = boost::variant<Instruction, Literal, Label, StackAssignment, Identifier, Assignment, FunctionCall, FunctionalInstruction, VariableDeclaration, FunctionDefinition, Switch, Block>; - -struct Scope; - struct AsmAnalysisInfo; /** @@ -102,6 +101,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<Scope::Variable const*> m_activeVariables; AsmAnalysisInfo& m_info; ErrorReporter& m_errorReporter; bool m_julia = false; diff --git a/libsolidity/inlineasm/AsmScope.cpp b/libsolidity/inlineasm/AsmScope.cpp index 7a086846..1db5ca41 100644 --- a/libsolidity/inlineasm/AsmScope.cpp +++ b/libsolidity/inlineasm/AsmScope.cpp @@ -46,7 +46,7 @@ bool Scope::registerFunction(string const& _name, std::vector<JuliaType> const& { if (exists(_name)) return false; - identifiers[_name] = Function(_arguments, _returns); + identifiers[_name] = Function{_arguments, _returns}; return true; } diff --git a/libsolidity/inlineasm/AsmScope.h b/libsolidity/inlineasm/AsmScope.h index ad321f77..de9119e0 100644 --- a/libsolidity/inlineasm/AsmScope.h +++ b/libsolidity/inlineasm/AsmScope.h @@ -65,27 +65,12 @@ struct Scope using JuliaType = std::string; using LabelID = size_t; - struct Variable - { - /// Used during code generation to store the stack height. @todo move there. - int stackHeight = 0; - /// Used during analysis to check whether we already passed the declaration inside the block. - /// @todo move there. - bool active = false; - JuliaType type; - }; - - struct Label - { - boost::optional<LabelID> id; - }; - + struct Variable { JuliaType type; }; + struct Label { }; struct Function { - Function(std::vector<JuliaType> const& _arguments, std::vector<JuliaType> const& _returns): arguments(_arguments), returns(_returns) {} std::vector<JuliaType> arguments; std::vector<JuliaType> returns; - boost::optional<LabelID> id; }; using Identifier = boost::variant<Variable, Label, Function>; |