mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Merge pull request #6825 from ethereum/style-fixes-assembly
[DOCS] Bring code examples inline with style guide in assembly doc
This commit is contained in:
commit
dc0fac5dfd
@ -104,47 +104,48 @@ efficient code, for example:
|
|||||||
|
|
||||||
pragma solidity >=0.4.16 <0.7.0;
|
pragma solidity >=0.4.16 <0.7.0;
|
||||||
|
|
||||||
|
|
||||||
library VectorSum {
|
library VectorSum {
|
||||||
// This function is less efficient because the optimizer currently fails to
|
// This function is less efficient because the optimizer currently fails to
|
||||||
// remove the bounds checks in array access.
|
// remove the bounds checks in array access.
|
||||||
function sumSolidity(uint[] memory _data) public pure returns (uint o_sum) {
|
function sumSolidity(uint[] memory _data) public pure returns (uint sum) {
|
||||||
for (uint i = 0; i < _data.length; ++i)
|
for (uint i = 0; i < _data.length; ++i)
|
||||||
o_sum += _data[i];
|
sum += _data[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
// We know that we only access the array in bounds, so we can avoid the check.
|
// We know that we only access the array in bounds, so we can avoid the check.
|
||||||
// 0x20 needs to be added to an array because the first slot contains the
|
// 0x20 needs to be added to an array because the first slot contains the
|
||||||
// array length.
|
// array length.
|
||||||
function sumAsm(uint[] memory _data) public pure returns (uint o_sum) {
|
function sumAsm(uint[] memory _data) public pure returns (uint sum) {
|
||||||
for (uint i = 0; i < _data.length; ++i) {
|
for (uint i = 0; i < _data.length; ++i) {
|
||||||
assembly {
|
assembly {
|
||||||
o_sum := add(o_sum, mload(add(add(_data, 0x20), mul(i, 0x20))))
|
sum := add(sum, mload(add(add(_data, 0x20), mul(i, 0x20))))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Same as above, but accomplish the entire code within inline assembly.
|
// Same as above, but accomplish the entire code within inline assembly.
|
||||||
function sumPureAsm(uint[] memory _data) public pure returns (uint o_sum) {
|
function sumPureAsm(uint[] memory _data) public pure returns (uint sum) {
|
||||||
assembly {
|
assembly {
|
||||||
// Load the length (first 32 bytes)
|
// Load the length (first 32 bytes)
|
||||||
let len := mload(_data)
|
let len := mload(_data)
|
||||||
|
|
||||||
// Skip over the length field.
|
// Skip over the length field.
|
||||||
//
|
//
|
||||||
// Keep temporary variable so it can be incremented in place.
|
// Keep temporary variable so it can be incremented in place.
|
||||||
//
|
//
|
||||||
// NOTE: incrementing _data would result in an unusable
|
// NOTE: incrementing _data would result in an unusable
|
||||||
// _data variable after this assembly block
|
// _data variable after this assembly block
|
||||||
let data := add(_data, 0x20)
|
let data := add(_data, 0x20)
|
||||||
|
|
||||||
// Iterate until the bound is not met.
|
// Iterate until the bound is not met.
|
||||||
for
|
for
|
||||||
{ let end := add(data, mul(len, 0x20)) }
|
{ let end := add(data, mul(len, 0x20)) }
|
||||||
lt(data, end)
|
lt(data, end)
|
||||||
{ data := add(data, 0x20) }
|
{ data := add(data, 0x20) }
|
||||||
{
|
{
|
||||||
o_sum := add(o_sum, mload(data))
|
sum := add(sum, mload(data))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -693,12 +694,13 @@ We consider the runtime bytecode of the following Solidity program::
|
|||||||
|
|
||||||
pragma solidity >=0.4.16 <0.7.0;
|
pragma solidity >=0.4.16 <0.7.0;
|
||||||
|
|
||||||
|
|
||||||
contract C {
|
contract C {
|
||||||
function f(uint x) public pure returns (uint y) {
|
function f(uint x) public pure returns (uint y) {
|
||||||
y = 1;
|
y = 1;
|
||||||
for (uint i = 0; i < x; i++)
|
for (uint i = 0; i < x; i++)
|
||||||
y = 2 * y;
|
y = 2 * y;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
The following assembly will be generated::
|
The following assembly will be generated::
|
||||||
|
Loading…
Reference in New Issue
Block a user