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) ### 0.5.10 (unreleased)
Important Bugfixes:
* Fix incorrect abi encoding of storage array of data type that occupy multiple storage slots
Language Features: Language Features:

View File

@ -154,7 +154,7 @@ private:
EncodingOptions const& _options EncodingOptions const& _options
); );
/// Part of @a abiEncodingFunction for array target type and given memory array or /// 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( std::string abiEncodingFunctionSimpleArray(
ArrayType const& _givenType, ArrayType const& _givenType,
ArrayType const& _targetType, ArrayType const& _targetType,

View File

@ -589,18 +589,29 @@ string YulUtilFunctions::nextArrayElementFunction(ArrayType const& _type)
} }
)"); )");
templ("functionName", functionName); templ("functionName", functionName);
if (_type.location() == DataLocation::Memory) switch (_type.location())
{
case DataLocation::Memory:
templ("advance", "0x20"); templ("advance", "0x20");
else if (_type.location() == DataLocation::Storage) break;
templ("advance", "1"); case DataLocation::Storage:
else if (_type.location() == DataLocation::CallData) {
templ("advance", toCompactHexWithPrefix( u256 size = _type.baseType()->storageSize();
solAssert(size >= 1, "");
templ("advance", toCompactHexWithPrefix(size));
break;
}
case DataLocation::CallData:
{
u256 size =
_type.baseType()->isDynamicallyEncoded() ? _type.baseType()->isDynamicallyEncoded() ?
32 : 32 :
_type.baseType()->calldataEncodedSize() _type.baseType()->calldataEncodedSize();
)); solAssert(size >= 32 && size % 32 == 0, "");
else templ("advance", toCompactHexWithPrefix(size));
solAssert(false, ""); break;
}
}
return templ.render(); 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. /// for the data position of an array which is stored in that slot / memory area / calldata area.
std::string arrayDataAreaFunction(ArrayType const& _type); std::string arrayDataAreaFunction(ArrayType const& _type);
/// @returns the name of a function that advances an array data pointer to the next element. /// @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); std::string nextArrayElementFunction(ArrayType const& _type);
/// @returns the name of a function that performs index access for mappings. /// @returns the name of a function that performs index access for mappings.