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)
|
||||
{
|
||||
solAssert(!m_currentLValue, "Current LValue not reset when trying to set to new one.");
|
||||
std::unique_ptr<LValue> lvalue;
|
||||
if (m_context.isLocalVariable(&_declaration))
|
||||
lvalue.reset(new StackVariable(m_context, _declaration));
|
||||
setLValue<StackVariable>(_expression, _declaration);
|
||||
else if (m_context.isStateVariable(&_declaration))
|
||||
lvalue.reset(new StorageItem(m_context, _declaration));
|
||||
setLValue<StorageItem>(_expression, _declaration);
|
||||
else
|
||||
BOOST_THROW_EXCEPTION(InternalCompilerError()
|
||||
<< errinfo_sourceLocation(_expression.getLocation())
|
||||
<< 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)
|
||||
{
|
||||
solAssert(!m_currentLValue, "Current LValue not reset when trying to set to new one.");
|
||||
std::unique_ptr<LValue> lvalue(new StorageItem(m_context, _expression.getType()));
|
||||
if (_expression.lvalueRequested())
|
||||
m_currentLValue = move(lvalue);
|
||||
else
|
||||
lvalue->retrieveValue(_expression.getLocation(), true);
|
||||
setLValue<StorageItem>(_expression, _expression.getType());
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -120,12 +120,27 @@ private:
|
||||
/// to be on the stack.
|
||||
/// Also retrieves the value if it was not requested by @a _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;
|
||||
CompilerContext& m_context;
|
||||
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