aboutsummaryrefslogtreecommitdiffstats
path: root/libsolidity/codegen/ContractCompiler.cpp
diff options
context:
space:
mode:
authorLeonardo Alt <leo@ethereum.org>2018-07-11 00:39:26 +0800
committerLeonardo Alt <leo@ethereum.org>2018-07-11 00:39:38 +0800
commit0c5e0e0d59dc55fcfe5b95a8c649a7a769ad3400 (patch)
treee6181dba547a13c0455ca67eac853daaa3971e71 /libsolidity/codegen/ContractCompiler.cpp
parentb750ca9741aba47cc8ba650a04dd620725ed4610 (diff)
downloaddexon-solidity-0c5e0e0d59dc55fcfe5b95a8c649a7a769ad3400.tar.gz
dexon-solidity-0c5e0e0d59dc55fcfe5b95a8c649a7a769ad3400.tar.zst
dexon-solidity-0c5e0e0d59dc55fcfe5b95a8c649a7a769ad3400.zip
Added assertion and tests suggestions
Diffstat (limited to 'libsolidity/codegen/ContractCompiler.cpp')
-rw-r--r--libsolidity/codegen/ContractCompiler.cpp10
1 files changed, 7 insertions, 3 deletions
diff --git a/libsolidity/codegen/ContractCompiler.cpp b/libsolidity/codegen/ContractCompiler.cpp
index 207e0af7..93f698bc 100644
--- a/libsolidity/codegen/ContractCompiler.cpp
+++ b/libsolidity/codegen/ContractCompiler.cpp
@@ -498,8 +498,12 @@ bool ContractCompiler::visit(FunctionDefinition const& _function)
m_context.adjustStackOffset(-(int)c_returnValuesSize);
/// The constructor and the fallback function doesn't to jump out.
- if (!_function.isConstructor() && !_function.isFallback())
- m_context.appendJump(eth::AssemblyItem::JumpType::OutOfFunction);
+ if (!_function.isConstructor())
+ {
+ solAssert(m_context.numberOfLocalVariables() == 0, "");
+ if (!_function.isFallback())
+ m_context.appendJump(eth::AssemblyItem::JumpType::OutOfFunction);
+ }
return false;
}
@@ -999,10 +1003,10 @@ eth::AssemblyPointer ContractCompiler::cloneRuntime() const
void ContractCompiler::popScopedVariables(ASTNode const* _node)
{
unsigned blockHeight = m_scopeStackHeight.at(m_modifierDepth).at(_node);
+ m_context.removeVariablesAboveStackHeight(blockHeight);
solAssert(m_context.stackHeight() >= blockHeight, "");
unsigned stackDiff = m_context.stackHeight() - blockHeight;
CompilerUtils(m_context).popStackSlots(stackDiff);
- m_context.removeVariablesAboveStackHeight(blockHeight);
m_scopeStackHeight[m_modifierDepth].erase(_node);
if (m_scopeStackHeight[m_modifierDepth].size() == 0)
m_scopeStackHeight.erase(m_modifierDepth);