Implement return.

This commit is contained in:
chriseth
2019-04-30 13:10:36 +02:00
parent cc5c899291
commit c1ca16cd33
6 changed files with 53 additions and 5 deletions
+8 -1
View File
@@ -116,7 +116,14 @@ string IRGenerator::generateFunction(FunctionDefinition const& _function)
{
string functionName = m_context.functionName(_function);
return m_context.functionCollector()->createFunction(functionName, [&]() {
Whiskers t("\nfunction <functionName>(<params>) <returns> {\n<body>\n}\n");
Whiskers t(R"(
function <functionName>(<params>) <returns> {
for { let return_flag := 1 } return_flag {} {
<body>
break
}
}
)");
t("functionName", functionName);
string params;
for (auto const& varDecl: _function.parameters())
@@ -126,9 +126,29 @@ bool IRGeneratorForStatements::visit(Assignment const& _assignment)
return false;
}
bool IRGeneratorForStatements::visit(Return const&)
bool IRGeneratorForStatements::visit(Return const& _return)
{
solUnimplemented("Return not yet implemented in yul code generation");
if (Expression const* value = _return.expression())
{
solAssert(_return.annotation().functionReturnParameters, "Invalid return parameters pointer.");
vector<ASTPointer<VariableDeclaration>> const& returnParameters =
_return.annotation().functionReturnParameters->parameters();
TypePointers types;
for (auto const& retVariable: returnParameters)
types.push_back(retVariable->annotation().type);
value->accept(*this);
// TODO support tuples
solUnimplementedAssert(types.size() == 1, "Multi-returns not implemented.");
m_code <<
m_context.variableName(*returnParameters.front()) <<
" := " <<
expressionAsType(*value, *types.front()) <<
"\n";
}
m_code << "return_flag := 0\n" << "break\n";
return false;
}
void IRGeneratorForStatements::endVisit(BinaryOperation const& _binOp)