Helper to count the number of variables in a scope.

This commit is contained in:
chriseth 2017-06-01 15:47:11 +02:00 committed by Alex Beregszaszi
parent 8e5c4bf21d
commit 78b49db779
4 changed files with 14 additions and 6 deletions

View File

@ -43,9 +43,8 @@ void CodeTransform::run(Block const& _block)
m_assembly.setSourceLocation(_block.location);
// pop variables
for (auto const& identifier: m_scope->identifiers)
if (identifier.second.type() == typeid(Scope::Variable))
m_assembly.appendInstruction(solidity::Instruction::POP);
for (size_t i = 0; i < m_scope->numberOfVariables(); ++i)
m_assembly.appendInstruction(solidity::Instruction::POP);
int deposit = m_assembly.stackHeight() - blockStartStackHeight;
solAssert(deposit == 0, "Invalid stack height at end of block.");

View File

@ -349,9 +349,7 @@ bool AsmAnalyzer::operator()(Block const& _block)
if (!boost::apply_visitor(*this, s))
success = false;
for (auto const& identifier: scope(&_block).identifiers)
if (identifier.second.type() == typeid(Scope::Variable))
--m_stackHeight;
m_stackHeight -= scope(&_block).numberOfVariables();
int const stackDiff = m_stackHeight - initialStackHeight;
if (stackDiff != 0)

View File

@ -80,6 +80,15 @@ bool Scope::exists(string const& _name)
return false;
}
size_t Scope::numberOfVariables() const
{
size_t count = 0;
for (auto const& identifier: identifiers)
if (identifier.second.type() == typeid(Scope::Variable))
count++;
return count;
}
bool Scope::insideFunction() const
{
for (Scope const* s = this; s; s = s->superScope)

View File

@ -109,6 +109,8 @@ struct Scope
/// across function and assembly boundaries).
bool exists(std::string const& _name);
/// @returns the number of variables directly registered inside the scope.
size_t numberOfVariables() const;
/// @returns true if this scope is inside a function.
bool insideFunction() const;