diff options
Diffstat (limited to 'libjulia/optimiser/FullInliner.cpp')
-rw-r--r-- | libjulia/optimiser/FullInliner.cpp | 32 |
1 files changed, 22 insertions, 10 deletions
diff --git a/libjulia/optimiser/FullInliner.cpp b/libjulia/optimiser/FullInliner.cpp index f5721617..42cbc804 100644 --- a/libjulia/optimiser/FullInliner.cpp +++ b/libjulia/optimiser/FullInliner.cpp @@ -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); - - m_statementsToPrefix.emplace_back(VariableDeclaration{ - funCall.location, - {{funCall.location, variableReplacements[returnVariable], fun.returnVariables[0].type}}, - {} - }); + 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}}, + {} + }); + _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) |