diff options
Diffstat (limited to 'libsolidity')
-rw-r--r-- | libsolidity/analysis/TypeChecker.cpp | 2 | ||||
-rw-r--r-- | libsolidity/codegen/ContractCompiler.cpp | 7 | ||||
-rw-r--r-- | libsolidity/inlineasm/AsmAnalysis.cpp | 7 | ||||
-rw-r--r-- | libsolidity/inlineasm/AsmAnalysis.h | 5 |
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; |