mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Merge pull request #1119 from chriseth/sol_arraysIndexAccess
Index access for arrays.
This commit is contained in:
commit
a24e0b5b15
@ -2667,6 +2667,107 @@ BOOST_AUTO_TEST_CASE(bytes_in_arguments)
|
|||||||
== encodeArgs(12, (8 + 9) * 3, 13, u256(innercalldata1.length())));
|
== encodeArgs(12, (8 + 9) * 3, 13, u256(innercalldata1.length())));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BOOST_AUTO_TEST_CASE(fixed_arrays_in_storage)
|
||||||
|
{
|
||||||
|
char const* sourceCode = R"(
|
||||||
|
contract c {
|
||||||
|
struct Data { uint x; uint y; }
|
||||||
|
Data[2**10] data;
|
||||||
|
uint[2**10 + 3] ids;
|
||||||
|
function setIDStatic(uint id) { ids[2] = id; }
|
||||||
|
function setID(uint index, uint id) { ids[index] = id; }
|
||||||
|
function setData(uint index, uint x, uint y) { data[index].x = x; data[index].y = y; }
|
||||||
|
function getID(uint index) returns (uint) { return ids[index]; }
|
||||||
|
function getData(uint index) returns (uint x, uint y) { x = data[index].x; y = data[index].y; }
|
||||||
|
function getLengths() returns (uint l1, uint l2) { l1 = data.length; l2 = ids.length; }
|
||||||
|
}
|
||||||
|
)";
|
||||||
|
compileAndRun(sourceCode);
|
||||||
|
BOOST_CHECK(callContractFunction("setIDStatic(uint256)", 11) == bytes());
|
||||||
|
BOOST_CHECK(callContractFunction("getID(uint256)", 2) == encodeArgs(11));
|
||||||
|
BOOST_CHECK(callContractFunction("setID(uint256,uint256)", 7, 8) == bytes());
|
||||||
|
BOOST_CHECK(callContractFunction("getID(uint256)", 7) == encodeArgs(8));
|
||||||
|
BOOST_CHECK(callContractFunction("setData(uint256,uint256,uint256)", 7, 8, 9) == bytes());
|
||||||
|
BOOST_CHECK(callContractFunction("setData(uint256,uint256,uint256)", 8, 10, 11) == bytes());
|
||||||
|
BOOST_CHECK(callContractFunction("getData(uint256)", 7) == encodeArgs(8, 9));
|
||||||
|
BOOST_CHECK(callContractFunction("getData(uint256)", 8) == encodeArgs(10, 11));
|
||||||
|
BOOST_CHECK(callContractFunction("getLengths()") == encodeArgs(u256(1) << 10, (u256(1) << 10) + 3));
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOST_AUTO_TEST_CASE(dynamic_arrays_in_storage)
|
||||||
|
{
|
||||||
|
char const* sourceCode = R"(
|
||||||
|
contract c {
|
||||||
|
struct Data { uint x; uint y; }
|
||||||
|
Data[] data;
|
||||||
|
uint[] ids;
|
||||||
|
function setIDStatic(uint id) { ids[2] = id; }
|
||||||
|
function setID(uint index, uint id) { ids[index] = id; }
|
||||||
|
function setData(uint index, uint x, uint y) { data[index].x = x; data[index].y = y; }
|
||||||
|
function getID(uint index) returns (uint) { return ids[index]; }
|
||||||
|
function getData(uint index) returns (uint x, uint y) { x = data[index].x; y = data[index].y; }
|
||||||
|
function getLengths() returns (uint l1, uint l2) { l1 = data.length; l2 = ids.length; }
|
||||||
|
function setLengths(uint l1, uint l2) { data.length = l1; ids.length = l2; }
|
||||||
|
}
|
||||||
|
)";
|
||||||
|
compileAndRun(sourceCode);
|
||||||
|
BOOST_CHECK(callContractFunction("getLengths()") == encodeArgs(0, 0));
|
||||||
|
BOOST_CHECK(callContractFunction("setLengths(uint256,uint256)", 48, 49) == bytes());
|
||||||
|
BOOST_CHECK(callContractFunction("getLengths()") == encodeArgs(48, 49));
|
||||||
|
BOOST_CHECK(callContractFunction("setIDStatic(uint256)", 11) == bytes());
|
||||||
|
BOOST_CHECK(callContractFunction("getID(uint256)", 2) == encodeArgs(11));
|
||||||
|
BOOST_CHECK(callContractFunction("setID(uint256,uint256)", 7, 8) == bytes());
|
||||||
|
BOOST_CHECK(callContractFunction("getID(uint256)", 7) == encodeArgs(8));
|
||||||
|
BOOST_CHECK(callContractFunction("setData(uint256,uint256,uint256)", 7, 8, 9) == bytes());
|
||||||
|
BOOST_CHECK(callContractFunction("setData(uint256,uint256,uint256)", 8, 10, 11) == bytes());
|
||||||
|
BOOST_CHECK(callContractFunction("getData(uint256)", 7) == encodeArgs(8, 9));
|
||||||
|
BOOST_CHECK(callContractFunction("getData(uint256)", 8) == encodeArgs(10, 11));
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOST_AUTO_TEST_CASE(fixed_out_of_bounds_array_access)
|
||||||
|
{
|
||||||
|
char const* sourceCode = R"(
|
||||||
|
contract c {
|
||||||
|
uint[4] data;
|
||||||
|
function set(uint index, uint value) returns (bool) { data[index] = value; return true; }
|
||||||
|
function get(uint index) returns (uint) { return data[index]; }
|
||||||
|
function length() returns (uint) { return data.length; }
|
||||||
|
}
|
||||||
|
)";
|
||||||
|
compileAndRun(sourceCode);
|
||||||
|
BOOST_CHECK(callContractFunction("length()") == encodeArgs(4));
|
||||||
|
BOOST_CHECK(callContractFunction("set(uint256,uint256)", 3, 4) == encodeArgs(true));
|
||||||
|
BOOST_CHECK(callContractFunction("set(uint256,uint256)", 4, 5) == bytes());
|
||||||
|
BOOST_CHECK(callContractFunction("set(uint256,uint256)", 400, 5) == bytes());
|
||||||
|
BOOST_CHECK(callContractFunction("get(uint256)", 3) == encodeArgs(4));
|
||||||
|
BOOST_CHECK(callContractFunction("get(uint256)", 4) == bytes());
|
||||||
|
BOOST_CHECK(callContractFunction("get(uint256)", 400) == bytes());
|
||||||
|
BOOST_CHECK(callContractFunction("length()") == encodeArgs(4));
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOST_AUTO_TEST_CASE(dynamic_out_of_bounds_array_access)
|
||||||
|
{
|
||||||
|
char const* sourceCode = R"(
|
||||||
|
contract c {
|
||||||
|
uint[] data;
|
||||||
|
function enlarge(uint amount) returns (uint) { return data.length += amount; }
|
||||||
|
function set(uint index, uint value) returns (bool) { data[index] = value; return true; }
|
||||||
|
function get(uint index) returns (uint) { return data[index]; }
|
||||||
|
function length() returns (uint) { return data.length; }
|
||||||
|
}
|
||||||
|
)";
|
||||||
|
compileAndRun(sourceCode);
|
||||||
|
BOOST_CHECK(callContractFunction("length()") == encodeArgs(0));
|
||||||
|
BOOST_CHECK(callContractFunction("get(uint256)", 3) == bytes());
|
||||||
|
BOOST_CHECK(callContractFunction("enlarge(uint256)", 4) == encodeArgs(4));
|
||||||
|
BOOST_CHECK(callContractFunction("length()") == encodeArgs(4));
|
||||||
|
BOOST_CHECK(callContractFunction("set(uint256,uint256)", 3, 4) == encodeArgs(true));
|
||||||
|
BOOST_CHECK(callContractFunction("get(uint256)", 3) == encodeArgs(4));
|
||||||
|
BOOST_CHECK(callContractFunction("length()") == encodeArgs(4));
|
||||||
|
BOOST_CHECK(callContractFunction("set(uint256,uint256)", 4, 8) == bytes());
|
||||||
|
BOOST_CHECK(callContractFunction("length()") == encodeArgs(4));
|
||||||
|
}
|
||||||
|
|
||||||
BOOST_AUTO_TEST_SUITE_END()
|
BOOST_AUTO_TEST_SUITE_END()
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user