mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Update text on function argument evaluation order.
Co-authored-by: Kamil Śliwak <kamil.sliwak@codepoets.it>
This commit is contained in:
parent
abbe460813
commit
6e74df8ab6
@ -138,30 +138,33 @@ The function ``preincr_u8(1)`` returns the following values:
|
|||||||
|
|
||||||
.. index:: ! evaluation order; function arguments
|
.. index:: ! evaluation order; function arguments
|
||||||
|
|
||||||
This behavior is also true for function argument expressions.
|
On the other hand, function argument expressions are evaluated in the same order by both code generators.
|
||||||
For example:
|
For example:
|
||||||
|
|
||||||
::
|
::
|
||||||
// SPDX-License-Identifier: GPL-3.0
|
// SPDX-License-Identifier: GPL-3.0
|
||||||
pragma solidity >0.8.0;
|
pragma solidity >0.8.0;
|
||||||
contract C {
|
contract C {
|
||||||
function identity(uint8 _a) public pure returns (uint8) {
|
function add(uint8 _a, uint8 _b) public pure returns (uint8) {
|
||||||
return _a;
|
return _a + _b;
|
||||||
}
|
}
|
||||||
function g(uint8 _b) public pure returns (uint8) {
|
function g(uint8 _a, uint8 _b) public pure returns (uint8) {
|
||||||
return identity(++_b + _b);
|
return add(++_a + ++_b, _a + _b);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
The function ``g(1)`` returns the following values:
|
The function ``g(1, 2)`` returns the following values:
|
||||||
- Old code generator: 3 (``1 + 2``) but the return value is unspecified in general
|
- Old code generator: ``10`` (``add(2 + 3, 2 + 3)``) but the return value is unspecified in general
|
||||||
- New code generator: 4 (``2 + 2``) but the return value is not guaranteed
|
- New code generator: ``10`` but the return value is not guaranteed
|
||||||
|
|
||||||
|
|
||||||
Internals
|
Internals
|
||||||
=========
|
=========
|
||||||
|
|
||||||
Internal function pointers:
|
Internal function pointers
|
||||||
|
--------------------------
|
||||||
|
|
||||||
|
.. index:: function pointers
|
||||||
|
|
||||||
The old code generator uses code offsets or tags for values of internal function pointers. This is especially complicated since
|
The old code generator uses code offsets or tags for values of internal function pointers. This is especially complicated since
|
||||||
these offsets are different at construction time and after deployment and the values can cross this border via storage.
|
these offsets are different at construction time and after deployment and the values can cross this border via storage.
|
||||||
@ -177,11 +180,11 @@ In the old code generator, internal function pointers are initialized with a spe
|
|||||||
This causes a storage write at construction time for internal function pointers in storage.
|
This causes a storage write at construction time for internal function pointers in storage.
|
||||||
|
|
||||||
Cleanup
|
Cleanup
|
||||||
--------
|
-------
|
||||||
|
|
||||||
.. index:: cleanup, dirty bits
|
.. index:: cleanup, dirty bits
|
||||||
|
|
||||||
The old code generator only performs cleanup before an operation whose result could be affected by the the values of the dirty bits.
|
The old code generator only performs cleanup before an operation whose result could be affected by the values of the dirty bits.
|
||||||
The new code generator performs cleanup after any operation that can result in dirty bits.
|
The new code generator performs cleanup after any operation that can result in dirty bits.
|
||||||
|
|
||||||
For example:
|
For example:
|
||||||
@ -189,7 +192,7 @@ For example:
|
|||||||
// SPDX-License-Identifier: GPL-3.0
|
// SPDX-License-Identifier: GPL-3.0
|
||||||
pragma solidity >0.8.0;
|
pragma solidity >0.8.0;
|
||||||
contract C {
|
contract C {
|
||||||
function f(uint8 _a) public returns(uint _r1, uint _r2)
|
function f(uint8 _a) public pure returns (uint _r1, uint _r2)
|
||||||
{
|
{
|
||||||
_a = ~_a;
|
_a = ~_a;
|
||||||
assembly {
|
assembly {
|
||||||
|
Loading…
Reference in New Issue
Block a user