Merge pull request #6171 from ethereum/ignorePrefixWhileInlining

Do not prepend function name to all variables when inlining.
This commit is contained in:
chriseth
2019-03-05 11:36:53 +01:00
committed by GitHub
24 changed files with 322 additions and 339 deletions
+3 -3
View File
@@ -177,7 +177,7 @@ vector<Statement> InlineModifier::performInline(Statement& _statement, FunctionC
// helper function to create a new variable that is supposed to model
// an existing variable.
auto newVariable = [&](TypedName const& _existingVariable, Expression* _value) {
YulString newName = m_nameDispenser.newName(_existingVariable.name, function->name);
YulString newName = m_nameDispenser.newName(_existingVariable.name);
variableReplacements[_existingVariable.name] = newName;
VariableDeclaration varDecl{_funCall.location, {{_funCall.location, newName, _existingVariable.type}}, {}};
if (_value)
@@ -192,7 +192,7 @@ vector<Statement> InlineModifier::performInline(Statement& _statement, FunctionC
for (auto const& var: function->returnVariables)
newVariable(var, nullptr);
Statement newBody = BodyCopier(m_nameDispenser, function->name, variableReplacements)(function->body);
Statement newBody = BodyCopier(m_nameDispenser, variableReplacements)(function->body);
newStatements += std::move(boost::get<Block>(newBody).statements);
boost::apply_visitor(GenericFallbackVisitor<Assignment, VariableDeclaration>{
@@ -228,7 +228,7 @@ vector<Statement> InlineModifier::performInline(Statement& _statement, FunctionC
Statement BodyCopier::operator()(VariableDeclaration const& _varDecl)
{
for (auto const& var: _varDecl.variables)
m_variableReplacements[var.name] = m_nameDispenser.newName(var.name, m_varNamePrefix);
m_variableReplacements[var.name] = m_nameDispenser.newName(var.name);
return ASTCopier::operator()(_varDecl);
}
-3
View File
@@ -140,11 +140,9 @@ class BodyCopier: public ASTCopier
public:
BodyCopier(
NameDispenser& _nameDispenser,
YulString _varNamePrefix,
std::map<YulString, YulString> const& _variableReplacements
):
m_nameDispenser(_nameDispenser),
m_varNamePrefix(_varNamePrefix),
m_variableReplacements(_variableReplacements)
{}
@@ -156,7 +154,6 @@ public:
YulString translateIdentifier(YulString _name) override;
NameDispenser& m_nameDispenser;
YulString m_varNamePrefix;
std::map<YulString, YulString> m_variableReplacements;
};
+1 -12
View File
@@ -39,18 +39,7 @@ NameDispenser::NameDispenser(Dialect const& _dialect, set<YulString> _usedNames)
{
}
YulString NameDispenser::newName(YulString _nameHint, YulString _context)
{
// Shortening rules: Use a suffix of _prefix and a prefix of _context.
YulString prefix = _nameHint;
if (!_context.empty())
prefix = YulString{_context.str().substr(0, 10) + "_" + prefix.str()};
return newNameInternal(prefix);
}
YulString NameDispenser::newNameInternal(YulString _nameHint)
YulString NameDispenser::newName(YulString _nameHint)
{
YulString name = _nameHint;
while (name.empty() || m_usedNames.count(name) || m_dialect.builtin(name))
+2 -6
View File
@@ -43,14 +43,10 @@ public:
/// Initialize the name dispenser with the given used names.
explicit NameDispenser(Dialect const& _dialect, std::set<YulString> _usedNames);
/// @returns a currently unused name that should be similar to _nameHint
/// and prefixed by _context if present.
/// If the resulting name would be too long, trims the context at the end
/// and the name hint at the start.
YulString newName(YulString _nameHint, YulString _context = {});
/// @returns a currently unused name that should be similar to _nameHint.
YulString newName(YulString _nameHint);
private:
YulString newNameInternal(YulString _nameHint);
Dialect const& m_dialect;
std::set<YulString> m_usedNames;