mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
commit
34be592e53
@ -57,22 +57,26 @@ class AssemblyItem
|
|||||||
public:
|
public:
|
||||||
enum class JumpType { Ordinary, IntoFunction, OutOfFunction };
|
enum class JumpType { Ordinary, IntoFunction, OutOfFunction };
|
||||||
|
|
||||||
AssemblyItem(u256 _push, langutil::SourceLocation const& _location = langutil::SourceLocation()):
|
AssemblyItem(u256 _push, langutil::SourceLocation _location = langutil::SourceLocation()):
|
||||||
AssemblyItem(Push, _push, _location) { }
|
AssemblyItem(Push, std::move(_push), std::move(_location)) { }
|
||||||
AssemblyItem(solidity::Instruction _i, langutil::SourceLocation const& _location = langutil::SourceLocation()):
|
AssemblyItem(solidity::Instruction _i, langutil::SourceLocation _location = langutil::SourceLocation()):
|
||||||
m_type(Operation),
|
m_type(Operation),
|
||||||
m_instruction(_i),
|
m_instruction(_i),
|
||||||
m_location(_location)
|
m_location(std::move(_location))
|
||||||
{}
|
{}
|
||||||
AssemblyItem(AssemblyItemType _type, u256 _data = 0, langutil::SourceLocation const& _location = langutil::SourceLocation()):
|
AssemblyItem(AssemblyItemType _type, u256 _data = 0, langutil::SourceLocation _location = langutil::SourceLocation()):
|
||||||
m_type(_type),
|
m_type(_type),
|
||||||
m_location(_location)
|
m_location(std::move(_location))
|
||||||
{
|
{
|
||||||
if (m_type == Operation)
|
if (m_type == Operation)
|
||||||
m_instruction = Instruction(uint8_t(_data));
|
m_instruction = Instruction(uint8_t(_data));
|
||||||
else
|
else
|
||||||
m_data = std::make_shared<u256>(_data);
|
m_data = std::make_shared<u256>(std::move(_data));
|
||||||
}
|
}
|
||||||
|
AssemblyItem(AssemblyItem const&) = default;
|
||||||
|
AssemblyItem(AssemblyItem&&) = default;
|
||||||
|
AssemblyItem& operator=(AssemblyItem const&) = default;
|
||||||
|
AssemblyItem& operator=(AssemblyItem&&) = default;
|
||||||
|
|
||||||
AssemblyItem tag() const { assertThrow(m_type == PushTag || m_type == Tag, Exception, ""); return AssemblyItem(Tag, data()); }
|
AssemblyItem tag() const { assertThrow(m_type == PushTag || m_type == Tag, Exception, ""); return AssemblyItem(Tag, data()); }
|
||||||
AssemblyItem pushTag() const { assertThrow(m_type == PushTag || m_type == Tag, Exception, ""); return AssemblyItem(PushTag, data()); }
|
AssemblyItem pushTag() const { assertThrow(m_type == PushTag || m_type == Tag, Exception, ""); return AssemblyItem(PushTag, data()); }
|
||||||
@ -114,6 +118,13 @@ public:
|
|||||||
return data() < _other.data();
|
return data() < _other.data();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Shortcut that avoids constructing an AssemblyItem just to perform the comparison.
|
||||||
|
bool operator==(Instruction _instr) const
|
||||||
|
{
|
||||||
|
return type() == Operation && instruction() == _instr;
|
||||||
|
}
|
||||||
|
bool operator!=(Instruction _instr) const { return !operator==(_instr); }
|
||||||
|
|
||||||
/// @returns an upper bound for the number of bytes required by this item, assuming that
|
/// @returns an upper bound for the number of bytes required by this item, assuming that
|
||||||
/// the value of a jump tag takes @a _addressLength bytes.
|
/// the value of a jump tag takes @a _addressLength bytes.
|
||||||
unsigned bytesRequired(unsigned _addressLength) const;
|
unsigned bytesRequired(unsigned _addressLength) const;
|
||||||
|
@ -160,8 +160,7 @@ struct CommutativeSwap: SimplePeepholeOptimizerMethod<CommutativeSwap, 2>
|
|||||||
{
|
{
|
||||||
// Remove SWAP1 if following instruction is commutative
|
// Remove SWAP1 if following instruction is commutative
|
||||||
if (
|
if (
|
||||||
_swap.type() == Operation &&
|
_swap == Instruction::SWAP1 &&
|
||||||
_swap.instruction() == Instruction::SWAP1 &&
|
|
||||||
SemanticInformation::isCommutativeOperation(_op)
|
SemanticInformation::isCommutativeOperation(_op)
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
@ -185,8 +184,7 @@ struct SwapComparison: SimplePeepholeOptimizerMethod<SwapComparison, 2>
|
|||||||
};
|
};
|
||||||
|
|
||||||
if (
|
if (
|
||||||
_swap.type() == Operation &&
|
_swap == Instruction::SWAP1 &&
|
||||||
_swap.instruction() == Instruction::SWAP1 &&
|
|
||||||
_op.type() == Operation &&
|
_op.type() == Operation &&
|
||||||
swappableOps.count(_op.instruction())
|
swappableOps.count(_op.instruction())
|
||||||
)
|
)
|
||||||
|
@ -108,7 +108,7 @@ bool SemanticInformation::isSwapInstruction(AssemblyItem const& _item)
|
|||||||
|
|
||||||
bool SemanticInformation::isJumpInstruction(AssemblyItem const& _item)
|
bool SemanticInformation::isJumpInstruction(AssemblyItem const& _item)
|
||||||
{
|
{
|
||||||
return _item == AssemblyItem(Instruction::JUMP) || _item == AssemblyItem(Instruction::JUMPI);
|
return _item == Instruction::JUMP || _item == Instruction::JUMPI;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool SemanticInformation::altersControlFlow(AssemblyItem const& _item)
|
bool SemanticInformation::altersControlFlow(AssemblyItem const& _item)
|
||||||
|
Loading…
Reference in New Issue
Block a user