mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Removed code duplication.
This commit is contained in:
parent
cc31a7ab32
commit
29c614ebaf
@ -1031,30 +1031,19 @@ void ExpressionCompiler::appendExpressionCopyToMemory(Type const& _expectedType,
|
|||||||
|
|
||||||
void ExpressionCompiler::setLValueFromDeclaration(Declaration const& _declaration, Expression const& _expression)
|
void ExpressionCompiler::setLValueFromDeclaration(Declaration const& _declaration, Expression const& _expression)
|
||||||
{
|
{
|
||||||
solAssert(!m_currentLValue, "Current LValue not reset when trying to set to new one.");
|
|
||||||
std::unique_ptr<LValue> lvalue;
|
|
||||||
if (m_context.isLocalVariable(&_declaration))
|
if (m_context.isLocalVariable(&_declaration))
|
||||||
lvalue.reset(new StackVariable(m_context, _declaration));
|
setLValue<StackVariable>(_expression, _declaration);
|
||||||
else if (m_context.isStateVariable(&_declaration))
|
else if (m_context.isStateVariable(&_declaration))
|
||||||
lvalue.reset(new StorageItem(m_context, _declaration));
|
setLValue<StorageItem>(_expression, _declaration);
|
||||||
else
|
else
|
||||||
BOOST_THROW_EXCEPTION(InternalCompilerError()
|
BOOST_THROW_EXCEPTION(InternalCompilerError()
|
||||||
<< errinfo_sourceLocation(_expression.getLocation())
|
<< errinfo_sourceLocation(_expression.getLocation())
|
||||||
<< errinfo_comment("Identifier type not supported or identifier not found."));
|
<< errinfo_comment("Identifier type not supported or identifier not found."));
|
||||||
if (_expression.lvalueRequested())
|
|
||||||
m_currentLValue = move(lvalue);
|
|
||||||
else
|
|
||||||
lvalue->retrieveValue(_expression.getLocation(), true);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ExpressionCompiler::setLValueToStorageItem(Expression const& _expression)
|
void ExpressionCompiler::setLValueToStorageItem(Expression const& _expression)
|
||||||
{
|
{
|
||||||
solAssert(!m_currentLValue, "Current LValue not reset when trying to set to new one.");
|
setLValue<StorageItem>(_expression, _expression.getType());
|
||||||
std::unique_ptr<LValue> lvalue(new StorageItem(m_context, _expression.getType()));
|
|
||||||
if (_expression.lvalueRequested())
|
|
||||||
m_currentLValue = move(lvalue);
|
|
||||||
else
|
|
||||||
lvalue->retrieveValue(_expression.getLocation(), true);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -120,12 +120,27 @@ private:
|
|||||||
/// to be on the stack.
|
/// to be on the stack.
|
||||||
/// Also retrieves the value if it was not requested by @a _expression.
|
/// Also retrieves the value if it was not requested by @a _expression.
|
||||||
void setLValueToStorageItem(Expression const& _expression);
|
void setLValueToStorageItem(Expression const& _expression);
|
||||||
|
/// Sets the current LValue to a new LValue constructed from the arguments.
|
||||||
|
/// Also retrieves the value if it was not requested by @a _expression.
|
||||||
|
template <class _LValueType, class... _Arguments>
|
||||||
|
void setLValue(Expression const& _expression, _Arguments const&... _arguments);
|
||||||
|
|
||||||
bool m_optimize;
|
bool m_optimize;
|
||||||
CompilerContext& m_context;
|
CompilerContext& m_context;
|
||||||
std::unique_ptr<LValue> m_currentLValue;
|
std::unique_ptr<LValue> m_currentLValue;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
template <class _LValueType, class... _Arguments>
|
||||||
|
void ExpressionCompiler::setLValue(Expression const& _expression, _Arguments const&... _arguments)
|
||||||
|
{
|
||||||
|
solAssert(!m_currentLValue, "Current LValue not reset when trying to set to new one.");
|
||||||
|
std::unique_ptr<_LValueType> lvalue(new _LValueType(m_context, _arguments...));
|
||||||
|
if (_expression.lvalueRequested())
|
||||||
|
m_currentLValue = move(lvalue);
|
||||||
|
else
|
||||||
|
lvalue->retrieveValue(_expression.getLocation(), true);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user