Merge pull request #6958 from sifmelcara/fix-abiencoderv2-codegen

Fix incorrect abi encoding of storage array of data type that occupy multiple storage slots
This commit is contained in:
chriseth
2019-06-20 13:08:42 +02:00
committed by GitHub
7 changed files with 81 additions and 12 deletions
+1 -1
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,
+20 -9
View File
@@ -737,18 +737,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();
});
}
+1 -1
View File
@@ -141,7 +141,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.