Merge pull request #6780 from ethereum/moveInitialization

make_vector helper for move initialization
This commit is contained in:
chriseth 2019-05-17 12:48:30 +02:00 committed by GitHub
commit 88e9fbe671
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 63 additions and 54 deletions

View File

@ -346,4 +346,27 @@ inline std::string findAnyOf(std::string const& _haystack, std::vector<std::stri
return needle; return needle;
return ""; return "";
} }
namespace detail
{
template<typename T>
void variadicEmplaceBack(std::vector<T>&) {}
template<typename T, typename A, typename... Args>
void variadicEmplaceBack(std::vector<T>& _vector, A&& _a, Args&&... _args)
{
_vector.emplace_back(std::forward<A>(_a));
variadicEmplaceBack(_vector, std::forward<Args>(_args)...);
}
}
template<typename T, typename... Args>
std::vector<T> make_vector(Args&&... _args)
{
std::vector<T> result;
result.reserve(sizeof...(_args));
detail::variadicEmplaceBack(result, std::forward<Args>(_args)...);
return result;
}
} }

View File

@ -72,11 +72,7 @@ OptionalStatements reduceNoCaseSwitch(Switch& _switchStmt)
auto loc = locationOf(*_switchStmt.expression); auto loc = locationOf(*_switchStmt.expression);
OptionalStatements s = vector<Statement>{}; return make_vector<Statement>(makePopExpressionStatement(loc, std::move(*_switchStmt.expression)));
s->emplace_back(makePopExpressionStatement(loc, std::move(*_switchStmt.expression)));
return s;
} }
OptionalStatements reduceSingleCaseSwitch(Switch& _switchStmt) OptionalStatements reduceSingleCaseSwitch(Switch& _switchStmt)
@ -86,26 +82,20 @@ OptionalStatements reduceSingleCaseSwitch(Switch& _switchStmt)
auto& switchCase = _switchStmt.cases.front(); auto& switchCase = _switchStmt.cases.front();
auto loc = locationOf(*_switchStmt.expression); auto loc = locationOf(*_switchStmt.expression);
if (switchCase.value) if (switchCase.value)
{ return make_vector<Statement>(If{
OptionalStatements s = vector<Statement>{}; std::move(_switchStmt.location),
s->emplace_back(If{ make_unique<Expression>(FunctionalInstruction{
std::move(_switchStmt.location), std::move(loc),
make_unique<Expression>(FunctionalInstruction{ dev::eth::Instruction::EQ,
std::move(loc), {std::move(*switchCase.value), std::move(*_switchStmt.expression)}
dev::eth::Instruction::EQ, }),
{std::move(*switchCase.value), std::move(*_switchStmt.expression)} std::move(switchCase.body)
}),
std::move(switchCase.body)
}); });
return s;
}
else else
{ return make_vector<Statement>(
OptionalStatements s = vector<Statement>{}; makePopExpressionStatement(loc, std::move(*_switchStmt.expression)),
s->emplace_back(makePopExpressionStatement(loc, std::move(*_switchStmt.expression))); std::move(switchCase.body)
s->emplace_back(std::move(switchCase.body)); );
return s;
}
} }
} }

View File

@ -56,20 +56,18 @@ void SSAReverser::operator()(Block& _block)
identifier && identifier &&
identifier->name == varDecl->variables.front().name identifier->name == varDecl->variables.front().name
) )
{ return make_vector<Statement>(
vector<Statement> result; Assignment{
result.emplace_back(Assignment{ std::move(assignment->location),
std::move(assignment->location), assignment->variableNames,
assignment->variableNames, std::move(varDecl->value)
std::move(varDecl->value) },
}); VariableDeclaration{
result.emplace_back(VariableDeclaration{ std::move(varDecl->location),
std::move(varDecl->location), std::move(varDecl->variables),
std::move(varDecl->variables), std::make_unique<Expression>(std::move(assignment->variableNames.front()))
std::make_unique<Expression>(std::move(assignment->variableNames.front())) }
}); );
return { std::move(result) };
}
} }
// Replaces // Replaces
// let a_1 := E // let a_1 := E
@ -89,22 +87,22 @@ void SSAReverser::operator()(Block& _block)
) )
) )
{ {
vector<Statement> result;
auto varIdentifier2 = std::make_unique<Expression>(Identifier{ auto varIdentifier2 = std::make_unique<Expression>(Identifier{
varDecl2->variables.front().location, varDecl2->variables.front().location,
varDecl2->variables.front().name varDecl2->variables.front().name
}); });
result.emplace_back(VariableDeclaration{ return make_vector<Statement>(
std::move(varDecl2->location), VariableDeclaration{
std::move(varDecl2->variables), std::move(varDecl2->location),
std::move(varDecl->value) std::move(varDecl2->variables),
}); std::move(varDecl->value)
result.emplace_back(VariableDeclaration{ },
std::move(varDecl->location), VariableDeclaration{
std::move(varDecl->variables), std::move(varDecl->location),
std::move(varIdentifier2) std::move(varDecl->variables),
}); std::move(varIdentifier2)
return { std::move(result) }; }
);
} }
} }

View File

@ -51,12 +51,10 @@ OptionalStatements replaceConstArgSwitch(Switch& _switchStmt, u256 const& _const
if (!matchingCaseBlock && defaultCase) if (!matchingCaseBlock && defaultCase)
matchingCaseBlock = &defaultCase->body; matchingCaseBlock = &defaultCase->body;
OptionalStatements s = vector<Statement>{};
if (matchingCaseBlock) if (matchingCaseBlock)
s->emplace_back(std::move(*matchingCaseBlock)); return make_vector<Statement>(std::move(*matchingCaseBlock));
else
return s; return {{}};
} }
} }