Add push() for dynamic storage arrays

This commit is contained in:
Leonardo Alt
2019-09-17 13:47:33 +02:00
parent 5b3efee93b
commit 43d6e00b14
12 changed files with 250 additions and 47 deletions
@@ -0,0 +1,32 @@
contract C {
uint[] array;
function f() public returns (uint) {
uint y = array.push();
return y;
}
function lv(uint value) public {
array.push() = value;
}
function a(uint index) public view returns (uint) {
return array[index];
}
function l() public view returns (uint) {
return array.length;
}
}
// ----
// l() -> 0
// lv(uint256): 42 ->
// l() -> 1
// a(uint256): 0 -> 42
// f() -> 0
// l() -> 2
// a(uint256): 1 -> 0
// lv(uint256): 111 ->
// l() -> 3
// a(uint256): 2 -> 111
@@ -0,0 +1,39 @@
contract C {
uint[][] array2d;
function l() public returns (uint) {
return array2d.length;
}
function ll(uint index) public returns (uint) {
return array2d[index].length;
}
function a(uint i, uint j) public returns (uint) {
return array2d[i][j];
}
function f(uint index, uint value) public {
uint[] storage pointer = array2d.push();
for (uint i = 0; i <= index; ++i)
pointer.push();
pointer[index] = value;
}
function lv(uint value) public {
array2d.push().push() = value;
}
}
// ----
// l() -> 0
// f(uint256,uint256): 42, 64 ->
// l() -> 1
// ll(uint256): 0 -> 43
// a(uint256,uint256): 0, 42 -> 64
// f(uint256,uint256): 84, 128 ->
// l() -> 2
// ll(uint256): 1 -> 85
// a(uint256,uint256): 0, 42 -> 64
// a(uint256,uint256): 1, 84 -> 128
// lv(uint256): 512 ->
// a(uint256,uint256): 2, 0 -> 512
@@ -0,0 +1,28 @@
contract C {
bytes array;
function f() public {
array.push();
}
function g(uint x) public {
for (uint i = 0; i < x; ++i)
array.push() = bytes1(uint8(i));
}
function l() public returns (uint) {
return array.length;
}
function a(uint index) public view returns (bytes1) {
return array[index];
}
}
// ----
// l() -> 0
// g(uint256): 70 ->
// l() -> 70
// a(uint256): 69 -> left(69)
// f() ->
// l() -> 71
// a(uint256): 70 -> 0
@@ -0,0 +1,44 @@
contract C {
struct S {
uint x;
}
S[] array;
function f(uint y) public {
S storage s = array.push();
g(s, y);
}
function g(S storage s, uint y) internal {
s.x = y;
}
function h(uint y) public {
g(array.push(), y);
}
function lv(uint y) public {
array.push().x = y;
}
function a(uint i) public returns (uint) {
return array[i].x;
}
function l() public returns (uint) {
return array.length;
}
}
// ----
// l() -> 0
// f(uint256): 42 ->
// l() -> 1
// a(uint256): 0 -> 42
// h(uint256): 84 ->
// l() -> 2
// a(uint256): 1 -> 84
// lv(uint256): 4096 ->
// l() -> 3
// a(uint256): 2 -> 4096