aboutsummaryrefslogtreecommitdiffstats
path: root/libsolidity/codegen/CompilerContext.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'libsolidity/codegen/CompilerContext.cpp')
-rw-r--r--libsolidity/codegen/CompilerContext.cpp16
1 files changed, 9 insertions, 7 deletions
diff --git a/libsolidity/codegen/CompilerContext.cpp b/libsolidity/codegen/CompilerContext.cpp
index 6875bda1..bc4de3ee 100644
--- a/libsolidity/codegen/CompilerContext.cpp
+++ b/libsolidity/codegen/CompilerContext.cpp
@@ -124,14 +124,15 @@ void CompilerContext::addVariable(VariableDeclaration const& _declaration,
unsigned _offsetToCurrent)
{
solAssert(m_asm->deposit() >= 0 && unsigned(m_asm->deposit()) >= _offsetToCurrent, "");
- solAssert(m_localVariables.count(&_declaration) == 0, "Variable already present");
- m_localVariables[&_declaration] = unsigned(m_asm->deposit()) - _offsetToCurrent;
+ m_localVariables[&_declaration].push_back(unsigned(m_asm->deposit()) - _offsetToCurrent);
}
void CompilerContext::removeVariable(VariableDeclaration const& _declaration)
{
- solAssert(!!m_localVariables.count(&_declaration), "");
- m_localVariables.erase(&_declaration);
+ solAssert(m_localVariables.count(&_declaration) && !m_localVariables[&_declaration].empty(), "");
+ m_localVariables[&_declaration].pop_back();
+ if (m_localVariables[&_declaration].empty())
+ m_localVariables.erase(&_declaration);
}
eth::Assembly const& CompilerContext::compiledContract(const ContractDefinition& _contract) const
@@ -196,15 +197,15 @@ ModifierDefinition const& CompilerContext::functionModifier(string const& _name)
for (ModifierDefinition const* modifier: contract->functionModifiers())
if (modifier->name() == _name)
return *modifier;
- BOOST_THROW_EXCEPTION(InternalCompilerError()
- << errinfo_comment("Function modifier " + _name + " not found."));
+ solAssert(false, "Function modifier " + _name + " not found.");
}
unsigned CompilerContext::baseStackOffsetOfVariable(Declaration const& _declaration) const
{
auto res = m_localVariables.find(&_declaration);
solAssert(res != m_localVariables.end(), "Variable not found on stack.");
- return res->second;
+ solAssert(!res->second.empty(), "");
+ return res->second.back();
}
unsigned CompilerContext::baseToCurrentStackOffset(unsigned _baseOffset) const
@@ -310,6 +311,7 @@ void CompilerContext::appendInlineAssembly(
if (stackDiff < 1 || stackDiff > 16)
BOOST_THROW_EXCEPTION(
CompilerError() <<
+ errinfo_sourceLocation(_identifier.location) <<
errinfo_comment("Stack too deep (" + to_string(stackDiff) + "), try removing local variables.")
);
if (_context == julia::IdentifierContext::RValue)