Fix storage array abi encoding

Fix incorrect abi encoding of storage array of data type that occupy multiple storage slots
This commit is contained in:
mingchuan 2019-06-19 10:46:05 +08:00
parent 7187a3e5ca
commit bfe074b2b1
No known key found for this signature in database
GPG Key ID: 607CD25FA2D03651
4 changed files with 26 additions and 11 deletions

View File

@ -1,5 +1,9 @@
### 0.5.10 (unreleased)
Important Bugfixes:
* Fix incorrect abi encoding of storage array of data type that occupy multiple storage slots
Language Features:

View File

@ -154,7 +154,7 @@ private:
EncodingOptions const& _options
);
/// Part of @a abiEncodingFunction for array target type and given memory array or
/// a given storage array with one item per slot.
/// a given storage array with every item occupies one or multiple full slots.
std::string abiEncodingFunctionSimpleArray(
ArrayType const& _givenType,
ArrayType const& _targetType,

View File

@ -589,18 +589,29 @@ string YulUtilFunctions::nextArrayElementFunction(ArrayType const& _type)
}
)");
templ("functionName", functionName);
if (_type.location() == DataLocation::Memory)
switch (_type.location())
{
case DataLocation::Memory:
templ("advance", "0x20");
else if (_type.location() == DataLocation::Storage)
templ("advance", "1");
else if (_type.location() == DataLocation::CallData)
templ("advance", toCompactHexWithPrefix(
break;
case DataLocation::Storage:
{
u256 size = _type.baseType()->storageSize();
solAssert(size >= 1, "");
templ("advance", toCompactHexWithPrefix(size));
break;
}
case DataLocation::CallData:
{
u256 size =
_type.baseType()->isDynamicallyEncoded() ?
32 :
_type.baseType()->calldataEncodedSize()
));
else
solAssert(false, "");
_type.baseType()->calldataEncodedSize();
solAssert(size >= 32 && size % 32 == 0, "");
templ("advance", toCompactHexWithPrefix(size));
break;
}
}
return templ.render();
});
}

View File

@ -113,7 +113,7 @@ public:
/// for the data position of an array which is stored in that slot / memory area / calldata area.
std::string arrayDataAreaFunction(ArrayType const& _type);
/// @returns the name of a function that advances an array data pointer to the next element.
/// Only works for memory arrays, calldata arrays and storage arrays that store one item per slot.
/// Only works for memory arrays, calldata arrays and storage arrays that every item occupies one or multiple full slots.
std::string nextArrayElementFunction(ArrayType const& _type);
/// @returns the name of a function that performs index access for mappings.