codegen: refactor common code

This commit is contained in:
Yoichi Hirai committed 2016-10-24 16:34:23 +02:00
1 parent acba7b92e5
commit 5245a3cf74
2 files changed
+15 -20

No files matched your search

+13 -20
View File
@@ -889,17 +889,7 @@ bool ExpressionCompiler::visit(MemberAccess const& _memberAccess)
// no-op
}
else if (auto variable = dynamic_cast<VariableDeclaration const*>(_memberAccess.annotation().referencedDeclaration))
{
// TODO duplicate code should be unified
if (!variable->isConstant())
setLValueFromDeclaration(*_memberAccess.annotation().referencedDeclaration, _memberAccess);
else
{
variable->value()->accept(*this);
utils().convertType(*variable->value()->annotation().type, *variable->annotation().type);
}
}
appendVariable(*variable, static_cast<Expression const&>(_memberAccess));
else
_memberAccess.expression().accept(*this);
}
@@ -1213,15 +1203,7 @@ void ExpressionCompiler::endVisit(Identifier const& _identifier)
else if (FunctionDefinition const* functionDef = dynamic_cast<FunctionDefinition const*>(declaration))
m_context << m_context.virtualFunctionEntryLabel(*functionDef).pushTag();
else if (auto variable = dynamic_cast<VariableDeclaration const*>(declaration))
{
if (!variable->isConstant())
setLValueFromDeclaration(*declaration, _identifier);
else
{
variable->value()->accept(*this);
utils().convertType(*variable->value()->annotation().type, *variable->annotation().type);
}
}
appendVariable(*variable, static_cast<Expression const&>(_identifier));
else if (auto contract = dynamic_cast<ContractDefinition const*>(declaration))
{
if (contract->isLibrary())
@@ -1650,6 +1632,17 @@ void ExpressionCompiler::appendExpressionCopyToMemory(Type const& _expectedType,
utils().storeInMemoryDynamic(_expectedType);
}
void ExpressionCompiler::appendVariable(VariableDeclaration const& _variable, Expression const& _expression)
{
if (!_variable.isConstant())
setLValueFromDeclaration(_variable, _expression);
else
{
_variable.value()->accept(*this);
utils().convertType(*_variable.value()->annotation().type, *_variable.annotation().type);
}
}
void ExpressionCompiler::setLValueFromDeclaration(Declaration const& _declaration, Expression const& _expression)
{
if (m_context.isLocalVariable(&_declaration))