Inline functions returning nothing.

This commit is contained in:
chriseth 2018-01-17 16:38:06 +01:00
parent 5cd84a630c
commit 4370bf5c40
2 changed files with 24 additions and 9 deletions

View File

@ -119,7 +119,7 @@ void InlineModifier::visit(Expression& _expression)
// TODO: Insert good heuristic here. Perhaps implement that inside the driver.
bool doInline = funCall.functionName.name != m_currentFunction;
if (fun.returnVariables.size() != 1)
if (fun.returnVariables.size() > 1)
doInline = false;
{
@ -137,18 +137,23 @@ void InlineModifier::visit(Expression& _expression)
return;
map<string, string> variableReplacements;
string returnVariable = fun.returnVariables[0].name;
for (size_t i = 0; i < funCall.arguments.size(); ++i)
variableReplacements[fun.parameters[i].name] = boost::get<Identifier>(funCall.arguments[i]).name;
variableReplacements[returnVariable] = newName(fun.name + "_" + returnVariable);
if (fun.returnVariables.empty())
_expression = noop(funCall.location);
else
{
string returnVariable = fun.returnVariables[0].name;
variableReplacements[returnVariable] = newName(fun.name + "_" + returnVariable);
m_statementsToPrefix.emplace_back(VariableDeclaration{
funCall.location,
{{funCall.location, variableReplacements[returnVariable], fun.returnVariables[0].type}},
{}
});
m_statementsToPrefix.emplace_back(VariableDeclaration{
funCall.location,
{{funCall.location, variableReplacements[returnVariable], fun.returnVariables[0].type}},
{}
});
_expression = Identifier{funCall.location, variableReplacements[returnVariable]};
}
m_statementsToPrefix.emplace_back(BodyCopier(m_nameDispenser, fun.name + "_", variableReplacements)(fun.body));
_expression = Identifier{funCall.location, variableReplacements[returnVariable]};
}
void InlineModifier::visitArguments(
@ -202,6 +207,13 @@ string InlineModifier::newName(string const& _prefix)
return m_nameDispenser.newName(_prefix);
}
Expression InlineModifier::noop(SourceLocation const& _location)
{
return FunctionalInstruction{_location, solidity::Instruction::POP, {
Literal{_location, assembly::LiteralKind::Number, "0", ""}
}};
}
Statement BodyCopier::operator()(VariableDeclaration const& _varDecl)
{
for (auto const& var: _varDecl.variables)

View File

@ -137,6 +137,9 @@ private:
std::string newName(std::string const& _prefix);
/// @returns an expression returning nothing.
Expression noop(SourceLocation const& _location);
/// List of statements that should go in front of the currently visited AST element,
/// at the statement level.
std::vector<Statement> m_statementsToPrefix;