mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Merge pull request #9985 from ethereum/optimizeDeleteStructSol2Yul
[Sol->Yul] Optimizing delete struct.
This commit is contained in:
@@ -0,0 +1,35 @@
|
||||
contract C {
|
||||
struct S {
|
||||
uint32 a;
|
||||
S[] x;
|
||||
}
|
||||
S s;
|
||||
function f() public returns (uint256 r1, uint256 r2, uint256 r3) {
|
||||
assembly {
|
||||
// 2 ** 150 - 1
|
||||
sstore(s.slot, 1427247692705959881058285969449495136382746623)
|
||||
}
|
||||
s.a = 1;
|
||||
s.x.push(); s.x.push();
|
||||
S storage ptr1 = s.x[0];
|
||||
S storage ptr2 = s.x[1];
|
||||
assembly {
|
||||
// 2 ** 150 - 1
|
||||
sstore(ptr1.slot, 1427247692705959881058285969449495136382746623)
|
||||
sstore(ptr2.slot, 1427247692705959881058285969449495136382746623)
|
||||
}
|
||||
s.x[0].a = 2; s.x[1].a = 3;
|
||||
delete s;
|
||||
assert(s.a == 0);
|
||||
assert(s.x.length == 0);
|
||||
assembly {
|
||||
r1 := sload(s.slot)
|
||||
r2 := sload(ptr1.slot)
|
||||
r3 := sload(ptr2.slot)
|
||||
}
|
||||
}
|
||||
}
|
||||
// ====
|
||||
// compileViaYul: true
|
||||
// ----
|
||||
// f() -> 0, 0, 0
|
||||
@@ -0,0 +1,24 @@
|
||||
contract C {
|
||||
struct S {
|
||||
uint64 y;
|
||||
uint64 z;
|
||||
}
|
||||
S s;
|
||||
function f() public returns (uint256 ret) {
|
||||
assembly {
|
||||
// 2 ** 150 - 1
|
||||
sstore(s.slot, 1427247692705959881058285969449495136382746623)
|
||||
}
|
||||
s.y = 1; s.z = 2;
|
||||
delete s;
|
||||
assert(s.y == 0);
|
||||
assert(s.z == 0);
|
||||
assembly {
|
||||
ret := sload(s.slot)
|
||||
}
|
||||
}
|
||||
}
|
||||
// ====
|
||||
// compileViaYul: true
|
||||
// ----
|
||||
// f() -> 0
|
||||
@@ -0,0 +1,29 @@
|
||||
contract C {
|
||||
struct S {
|
||||
uint32 a;
|
||||
uint32[3] b;
|
||||
uint32[] x;
|
||||
}
|
||||
S s;
|
||||
function f() public returns (uint256 ret) {
|
||||
assembly {
|
||||
// 2 ** 150 - 1
|
||||
sstore(s.slot, 1427247692705959881058285969449495136382746623)
|
||||
}
|
||||
s.a = 1;
|
||||
s.b[0] = 2; s.b[1] = 3;
|
||||
s.x.push(4); s.x.push(5);
|
||||
delete s;
|
||||
assert(s.a == 0);
|
||||
assert(s.b[0] == 0);
|
||||
assert(s.b[1] == 0);
|
||||
assert(s.x.length == 0);
|
||||
assembly {
|
||||
ret := sload(s.slot)
|
||||
}
|
||||
}
|
||||
}
|
||||
// ====
|
||||
// compileViaYul: true
|
||||
// ----
|
||||
// f() -> 0
|
||||
Reference in New Issue
Block a user