mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Copying calldata directly to memory.
This commit is contained in:
parent
1c3c1f1e5d
commit
56c6eaf509
@ -76,35 +76,44 @@ void CompilerUtils::storeInMemoryDynamic(Type const& _type, bool _padToWordBound
|
|||||||
if (_type.getCategory() == Type::Category::ByteArray)
|
if (_type.getCategory() == Type::Category::ByteArray)
|
||||||
{
|
{
|
||||||
auto const& type = dynamic_cast<ByteArrayType const&>(_type);
|
auto const& type = dynamic_cast<ByteArrayType const&>(_type);
|
||||||
solAssert(type.getLocation() == ByteArrayType::Location::Storage, "Non-storage byte arrays not yet implemented.");
|
|
||||||
|
|
||||||
m_context << eth::Instruction::DUP1 << eth::Instruction::SLOAD;
|
if (type.getLocation() == ByteArrayType::Location::CallData)
|
||||||
// stack here: memory_offset storage_offset length_bytes
|
{
|
||||||
// jump to end if length is zero
|
m_context << eth::Instruction::CALLDATASIZE << u256(0) << eth::Instruction::DUP3
|
||||||
m_context << eth::Instruction::DUP1 << eth::Instruction::ISZERO;
|
<< eth::Instruction::CALLDATACOPY
|
||||||
eth::AssemblyItem loopEnd = m_context.newTag();
|
<< eth::Instruction::CALLDATASIZE << eth::Instruction::ADD;
|
||||||
m_context.appendConditionalJumpTo(loopEnd);
|
}
|
||||||
// compute memory end offset
|
else
|
||||||
m_context << eth::Instruction::DUP3 << eth::Instruction::ADD << eth::Instruction::SWAP2;
|
{
|
||||||
// actual array data is stored at SHA3(storage_offset)
|
solAssert(type.getLocation() == ByteArrayType::Location::Storage, "Memory byte arrays not yet implemented.");
|
||||||
m_context << eth::Instruction::SWAP1;
|
m_context << eth::Instruction::DUP1 << eth::Instruction::SLOAD;
|
||||||
CompilerUtils(m_context).computeHashStatic();
|
// stack here: memory_offset storage_offset length_bytes
|
||||||
m_context << eth::Instruction::SWAP1;
|
// jump to end if length is zero
|
||||||
|
m_context << eth::Instruction::DUP1 << eth::Instruction::ISZERO;
|
||||||
|
eth::AssemblyItem loopEnd = m_context.newTag();
|
||||||
|
m_context.appendConditionalJumpTo(loopEnd);
|
||||||
|
// compute memory end offset
|
||||||
|
m_context << eth::Instruction::DUP3 << eth::Instruction::ADD << eth::Instruction::SWAP2;
|
||||||
|
// actual array data is stored at SHA3(storage_offset)
|
||||||
|
m_context << eth::Instruction::SWAP1;
|
||||||
|
CompilerUtils(m_context).computeHashStatic();
|
||||||
|
m_context << eth::Instruction::SWAP1;
|
||||||
|
|
||||||
// stack here: memory_end_offset storage_data_offset memory_offset
|
// stack here: memory_end_offset storage_data_offset memory_offset
|
||||||
eth::AssemblyItem loopStart = m_context.newTag();
|
eth::AssemblyItem loopStart = m_context.newTag();
|
||||||
m_context << loopStart
|
m_context << loopStart
|
||||||
// load and store
|
// load and store
|
||||||
<< eth::Instruction::DUP2 << eth::Instruction::SLOAD
|
<< eth::Instruction::DUP2 << eth::Instruction::SLOAD
|
||||||
<< eth::Instruction::DUP2 << eth::Instruction::MSTORE
|
<< eth::Instruction::DUP2 << eth::Instruction::MSTORE
|
||||||
// increment storage_data_offset by 1
|
// increment storage_data_offset by 1
|
||||||
<< eth::Instruction::SWAP1 << u256(1) << eth::Instruction::ADD
|
<< eth::Instruction::SWAP1 << u256(1) << eth::Instruction::ADD
|
||||||
// increment memory offset by 32
|
// increment memory offset by 32
|
||||||
<< eth::Instruction::SWAP1 << u256(32) << eth::Instruction::ADD
|
<< eth::Instruction::SWAP1 << u256(32) << eth::Instruction::ADD
|
||||||
// check for loop condition
|
// check for loop condition
|
||||||
<< eth::Instruction::DUP1 << eth::Instruction::DUP4 << eth::Instruction::GT;
|
<< eth::Instruction::DUP1 << eth::Instruction::DUP4 << eth::Instruction::GT;
|
||||||
m_context.appendConditionalJumpTo(loopStart);
|
m_context.appendConditionalJumpTo(loopStart);
|
||||||
m_context << loopEnd << eth::Instruction::POP << eth::Instruction::POP;
|
m_context << loopEnd << eth::Instruction::POP << eth::Instruction::POP;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user