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

View File

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

View File

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