ABIEncoderV2: Implement calldata structs without dynamically encoded members.

This commit is contained in:
Daniel Kirchner
2019-02-11 15:46:58 +01:00
parent 94607011dc
commit 0e4912a203
16 changed files with 377 additions and 18 deletions
+18
View File
@@ -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(), "");
+1
View File
@@ -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; }