mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Multi-variable declarations.
This commit is contained in:
@@ -623,13 +623,29 @@ bool Compiler::visit(VariableDeclarationStatement const& _variableDeclarationSta
|
||||
{
|
||||
StackHeightChecker checker(m_context);
|
||||
CompilerContext::LocationSetter locationSetter(m_context, _variableDeclarationStatement);
|
||||
solAssert(_variableDeclarationStatement.declarations().size() == 1, "To be implemented.");
|
||||
solAssert(!!_variableDeclarationStatement.declarations().front(), "");
|
||||
VariableDeclaration const& varDecl = *_variableDeclarationStatement.declarations().front();
|
||||
if (Expression const* expression = _variableDeclarationStatement.initialValue())
|
||||
{
|
||||
compileExpression(*expression, varDecl.annotation().type);
|
||||
CompilerUtils(m_context).moveToStackVariable(varDecl);
|
||||
CompilerUtils utils(m_context);
|
||||
compileExpression(*expression);
|
||||
TypePointers valueTypes;
|
||||
if (auto tupleType = dynamic_cast<TupleType const*>(expression->annotation().type.get()))
|
||||
valueTypes = tupleType->components();
|
||||
else
|
||||
valueTypes = TypePointers{expression->annotation().type};
|
||||
auto const& assignments = _variableDeclarationStatement.annotation().assignments;
|
||||
solAssert(assignments.size() == valueTypes.size(), "");
|
||||
for (size_t i = 0; i < assignments.size(); ++i)
|
||||
{
|
||||
size_t j = assignments.size() - i - 1;
|
||||
VariableDeclaration const* varDecl = assignments[j];
|
||||
if (!varDecl)
|
||||
utils.popStackElement(*valueTypes[j]);
|
||||
else
|
||||
{
|
||||
utils.convertType(*valueTypes[j], *varDecl->annotation().type);
|
||||
utils.moveToStackVariable(*varDecl);
|
||||
}
|
||||
}
|
||||
}
|
||||
checker.check();
|
||||
return false;
|
||||
|
||||
Reference in New Issue
Block a user