mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
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:
parent
7187a3e5ca
commit
bfe074b2b1
@ -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:
|
||||||
|
|
||||||
|
|
||||||
|
@ -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,
|
||||||
|
@ -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();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -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.
|
||||||
|
Loading…
Reference in New Issue
Block a user