mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
ABIEncoderV2: Implement calldata structs without dynamically encoded members.
This commit is contained in:
@@ -2053,6 +2053,24 @@ unsigned StructType::calldataEncodedSize(bool) const
|
||||
return size;
|
||||
}
|
||||
|
||||
unsigned StructType::calldataOffsetOfMember(std::string const& _member) const
|
||||
{
|
||||
unsigned offset = 0;
|
||||
for (auto const& member: members(nullptr))
|
||||
{
|
||||
solAssert(member.type->canLiveOutsideStorage(), "");
|
||||
if (member.name == _member)
|
||||
return offset;
|
||||
{
|
||||
// Struct members are always padded.
|
||||
unsigned memberSize = member.type->calldataEncodedSize(true);
|
||||
solAssert(memberSize != 0, "");
|
||||
offset += memberSize;
|
||||
}
|
||||
}
|
||||
solAssert(false, "Struct member not found.");
|
||||
}
|
||||
|
||||
bool StructType::isDynamicallyEncoded() const
|
||||
{
|
||||
solAssert(!recursive(), "");
|
||||
|
||||
@@ -852,6 +852,7 @@ public:
|
||||
|
||||
std::pair<u256, unsigned> const& storageOffsetsOfMember(std::string const& _name) const;
|
||||
u256 memoryOffsetOfMember(std::string const& _name) const;
|
||||
unsigned calldataOffsetOfMember(std::string const& _name) const;
|
||||
|
||||
StructDefinition const& structDefinition() const { return m_struct; }
|
||||
|
||||
|
||||
Reference in New Issue
Block a user