Multi-variable declarations.

This commit is contained in:
chriseth
2015-10-13 12:16:23 +02:00
parent a5d12b8761
commit deebc7e860
9 changed files with 166 additions and 77 deletions
+21 -5
View File
@@ -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;