Move "active variable" to analysis phase.

This commit is contained in:
chriseth 2017-06-14 00:07:13 +02:00
parent 1bf717fd65
commit 154002cda0
3 changed files with 10 additions and 16 deletions

View File

@ -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<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;
@ -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<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;
@ -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<Scope::Variable>(*var).active)
else if (!m_activeVariables.count(&boost::get<Scope::Variable>(*var)))
{
m_errorReporter.declarationError(
_variable.location,

View File

@ -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;
/**
@ -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<Scope::Variable const*> m_activeVariables;
AsmAnalysisInfo& m_info;
ErrorReporter& m_errorReporter;
bool m_julia = false;

View File

@ -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<JuliaType> arguments;