aboutsummaryrefslogtreecommitdiffstats
path: root/libsolidity
diff options
context:
space:
mode:
Diffstat (limited to 'libsolidity')
-rw-r--r--libsolidity/analysis/TypeChecker.cpp2
-rw-r--r--libsolidity/codegen/ContractCompiler.cpp7
-rw-r--r--libsolidity/inlineasm/AsmAnalysis.cpp7
-rw-r--r--libsolidity/inlineasm/AsmAnalysis.h5
4 files changed, 13 insertions, 8 deletions
diff --git a/libsolidity/analysis/TypeChecker.cpp b/libsolidity/analysis/TypeChecker.cpp
index 11c27238..2d6a782a 100644
--- a/libsolidity/analysis/TypeChecker.cpp
+++ b/libsolidity/analysis/TypeChecker.cpp
@@ -654,6 +654,8 @@ bool TypeChecker::visit(InlineAssembly const& _inlineAssembly)
else if (!var->type()->isValueType())
valueSize = 1;
else
+ // We cannot use `sizeOnStack()` here because we do not insert the value
+ // into inline assembly but rather the storage location.
valueSize = 2; // slot number, intra slot offset
}
else if (auto contract = dynamic_cast<ContractDefinition const*>(declaration))
diff --git a/libsolidity/codegen/ContractCompiler.cpp b/libsolidity/codegen/ContractCompiler.cpp
index a583f8b4..c035bd1f 100644
--- a/libsolidity/codegen/ContractCompiler.cpp
+++ b/libsolidity/codegen/ContractCompiler.cpp
@@ -591,7 +591,9 @@ bool ContractCompiler::visit(InlineAssembly const& _inlineAssembly)
}
else
solAssert(false, "Invalid declaration type.");
- } else {
+ }
+ else
+ {
// lvalue context
auto variable = dynamic_cast<VariableDeclaration const*>(decl);
solAssert(
@@ -606,7 +608,8 @@ bool ContractCompiler::visit(InlineAssembly const& _inlineAssembly)
errinfo_sourceLocation(_inlineAssembly.location()) <<
errinfo_comment("Stack too deep, try removing local variables.")
);
- for (unsigned i = 0; i < size; ++i) {
+ for (unsigned i = 0; i < size; ++i)
+ {
_assembly.append(swapInstruction(stackDiff));
_assembly.append(Instruction::POP);
}
diff --git a/libsolidity/inlineasm/AsmAnalysis.cpp b/libsolidity/inlineasm/AsmAnalysis.cpp
index e989560d..53f48819 100644
--- a/libsolidity/inlineasm/AsmAnalysis.cpp
+++ b/libsolidity/inlineasm/AsmAnalysis.cpp
@@ -246,7 +246,7 @@ bool AsmAnalyzer::operator()(assembly::FunctionCall const& _funCall)
if (!expectDeposit(1, stackHeight, locationOf(arg)))
success = false;
}
- m_stackHeight += returns - arguments;
+ m_stackHeight += int(returns) - int(arguments);
return success;
}
@@ -255,9 +255,8 @@ bool AsmAnalyzer::operator()(Block const& _block)
bool success = true;
m_currentScope = &scope(&_block);
- int const virtualVariablesInNextBlock = m_virtualVariablesInNextBlock;
+ int const initialStackHeight = m_stackHeight - m_virtualVariablesInNextBlock;
m_virtualVariablesInNextBlock = 0;
- int const initialStackHeight = m_stackHeight;
for (auto const& s: _block.statements)
if (!boost::apply_visitor(*this, s))
@@ -267,7 +266,7 @@ bool AsmAnalyzer::operator()(Block const& _block)
if (identifier.second.type() == typeid(Scope::Variable))
--m_stackHeight;
- int const stackDiff = m_stackHeight - initialStackHeight + virtualVariablesInNextBlock;
+ int const stackDiff = m_stackHeight - initialStackHeight;
if (stackDiff != 0)
{
m_errors.push_back(make_shared<Error>(
diff --git a/libsolidity/inlineasm/AsmAnalysis.h b/libsolidity/inlineasm/AsmAnalysis.h
index cfc9b25a..ed357561 100644
--- a/libsolidity/inlineasm/AsmAnalysis.h
+++ b/libsolidity/inlineasm/AsmAnalysis.h
@@ -82,8 +82,9 @@ private:
bool expectDeposit(int _deposit, int _oldHeight, SourceLocation const& _location);
Scope& scope(assembly::Block const* _block);
- /// Number of excess stack slots generated by function arguments to take into account for
- /// next block.
+ /// This is used when we enter the body of a function definition. There, the parameters
+ /// and return parameters appear as variables which are already on the stack before
+ /// we enter the block.
int m_virtualVariablesInNextBlock = 0;
int m_stackHeight = 0;
ExternalIdentifierAccess::Resolver const& m_resolver;