Merge pull request #7015 from ethereum/sol-yul-arrays

[Sol->Yul] Implement uint256[] memory arrays
This commit is contained in:
chriseth
2019-07-09 17:34:46 +02:00
committed by GitHub
9 changed files with 440 additions and 16 deletions
@@ -0,0 +1,26 @@
contract C {
function test(uint256 len, uint idx) public returns (uint256)
{
uint[] memory array = new uint[](len);
uint result = receiver(array, idx);
for (uint256 i = 0; i < array.length; i++)
require(array[i] == i + 1);
return result;
}
function receiver(uint[] memory array, uint idx) public returns (uint256)
{
for (uint256 i = 0; i < array.length; i++)
array[i] = i + 1;
return array[idx];
}
}
// ====
// compileViaYul: true
// ----
// test(uint256,uint256): 0,0 -> FAILURE
// test(uint256,uint256): 1,0 -> 1
// test(uint256,uint256): 10,5 -> 6
// test(uint256,uint256): 10,50 -> FAILURE
@@ -0,0 +1,13 @@
contract C {
function create(uint256 len) public returns (uint256)
{
uint[] memory array = new uint[](len);
return array.length;
}
}
// ====
// compileViaYul: true
// ----
// create(uint256): 0 -> 0
// create(uint256): 7 -> 7
// create(uint256): 10 -> 10
@@ -0,0 +1,35 @@
contract C {
function index(uint256 len) public returns (bool)
{
uint[] memory array = new uint[](len);
for (uint256 i = 0; i < len; i++)
array[i] = i + 1;
for (uint256 i = 0; i < len; i++)
require(array[i] == i + 1, "Unexpected value in array!");
return array.length == len;
}
function accessIndex(uint256 len, int256 idx) public returns (uint256)
{
uint[] memory array = new uint[](len);
for (uint256 i = 0; i < len; i++)
array[i] = i + 1;
return array[uint256(idx)];
}
}
// ====
// compileViaYul: true
// ----
// index(uint256): 0 -> true
// index(uint256): 10 -> true
// index(uint256): 20 -> true
// index(uint256): 0xFF -> true
// accessIndex(uint256,int256): 10,1 -> 2
// accessIndex(uint256,int256): 10,0 -> 1
// accessIndex(uint256,int256): 10,11 -> FAILURE
// accessIndex(uint256,int256): 10,10 -> FAILURE
// accessIndex(uint256,int256): 10,-1 -> FAILURE
@@ -17,10 +17,6 @@ contract C {
return func() == internal_func();
}
function external_func() external pure returns (int8)
{
return 1;
}
}
// ====
// compileViaYul: true