mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Fix for signed integers in storage.
This commit is contained in:
parent
6e5de4832d
commit
5622364a98
16
LValue.cpp
16
LValue.cpp
@ -107,6 +107,11 @@ void StorageItem::retrieveValue(SourceLocation const&, bool _remove) const
|
|||||||
<< u256(0x100) << eth::Instruction::EXP << eth::Instruction::SWAP1 << eth::Instruction::DIV;
|
<< u256(0x100) << eth::Instruction::EXP << eth::Instruction::SWAP1 << eth::Instruction::DIV;
|
||||||
if (m_dataType.getCategory() == Type::Category::FixedBytes)
|
if (m_dataType.getCategory() == Type::Category::FixedBytes)
|
||||||
m_context << (u256(0x1) << (256 - 8 * m_dataType.getStorageBytes())) << eth::Instruction::MUL;
|
m_context << (u256(0x1) << (256 - 8 * m_dataType.getStorageBytes())) << eth::Instruction::MUL;
|
||||||
|
else if (
|
||||||
|
m_dataType.getCategory() == Type::Category::Integer &&
|
||||||
|
dynamic_cast<IntegerType const&>(m_dataType).isSigned()
|
||||||
|
)
|
||||||
|
m_context << u256(m_dataType.getStorageBytes() - 1) << eth::Instruction::SIGNEXTEND;
|
||||||
else
|
else
|
||||||
m_context << ((u256(0x1) << (8 * m_dataType.getStorageBytes())) - 1) << eth::Instruction::AND;
|
m_context << ((u256(0x1) << (8 * m_dataType.getStorageBytes())) - 1) << eth::Instruction::AND;
|
||||||
}
|
}
|
||||||
@ -148,6 +153,17 @@ void StorageItem::storeValue(Type const& _sourceType, SourceLocation const& _loc
|
|||||||
m_context
|
m_context
|
||||||
<< (u256(0x1) << (256 - 8 * dynamic_cast<FixedBytesType const&>(m_dataType).getNumBytes()))
|
<< (u256(0x1) << (256 - 8 * dynamic_cast<FixedBytesType const&>(m_dataType).getNumBytes()))
|
||||||
<< eth::Instruction::SWAP1 << eth::Instruction::DIV;
|
<< eth::Instruction::SWAP1 << eth::Instruction::DIV;
|
||||||
|
else if (
|
||||||
|
m_dataType.getCategory() == Type::Category::Integer &&
|
||||||
|
dynamic_cast<IntegerType const&>(m_dataType).isSigned()
|
||||||
|
)
|
||||||
|
// remove the higher order bits
|
||||||
|
m_context
|
||||||
|
<< (u256(1) << (8 * (32 - m_dataType.getStorageBytes())))
|
||||||
|
<< eth::Instruction::SWAP1
|
||||||
|
<< eth::Instruction::DUP2
|
||||||
|
<< eth::Instruction::MUL
|
||||||
|
<< eth::Instruction::DIV;
|
||||||
m_context << eth::Instruction::MUL << eth::Instruction::OR;
|
m_context << eth::Instruction::MUL << eth::Instruction::OR;
|
||||||
// stack: value storage_ref updated_value
|
// stack: value storage_ref updated_value
|
||||||
m_context << eth::Instruction::SWAP1 << eth::Instruction::SSTORE;
|
m_context << eth::Instruction::SWAP1 << eth::Instruction::SSTORE;
|
||||||
|
Loading…
Reference in New Issue
Block a user