mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Implement calldata arrays for Yul IR
This commit is contained in:
@@ -0,0 +1,20 @@
|
||||
pragma experimental ABIEncoderV2;
|
||||
contract C {
|
||||
function f(uint256[] calldata x, uint256 i) external returns (uint256) {
|
||||
return x[i];
|
||||
}
|
||||
function f(uint256[][] calldata x, uint256 i, uint256 j) external returns (uint256) {
|
||||
return x[i][j];
|
||||
}
|
||||
}
|
||||
// ====
|
||||
// compileViaYul: also
|
||||
// ----
|
||||
// f(uint256[],uint256): 0x40, 0, 0 -> FAILURE
|
||||
// f(uint256[],uint256): 0x40, 0, 1, 23 -> 23
|
||||
// f(uint256[],uint256): 0x40, 1, 1, 23 -> FAILURE
|
||||
// f(uint256[],uint256): 0x40, 0, 2, 23, 42 -> 23
|
||||
// f(uint256[],uint256): 0x40, 1, 2, 23, 42 -> 42
|
||||
// f(uint256[],uint256): 0x40, 2, 2, 23, 42 -> FAILURE
|
||||
// f(uint256[][],uint256,uint256): 0x60, 0, 0 -> FAILURE
|
||||
// f(uint256[][],uint256,uint256): 0x60, 0, 0, 1, 0x20, 1, 23 -> 23
|
||||
@@ -0,0 +1,34 @@
|
||||
pragma experimental ABIEncoderV2;
|
||||
contract C {
|
||||
function f(uint256[] calldata x) external returns (uint256) {
|
||||
return x.length;
|
||||
}
|
||||
function f(uint256[][] calldata x) external returns (uint256 l1, uint256 l2, uint256 l3) {
|
||||
l1 = x.length;
|
||||
if (l1 > 0) l2 = x[0].length;
|
||||
if (l1 > 1) l3 = x[1].length;
|
||||
}
|
||||
function f(uint256[2] calldata x) external returns (uint256) {
|
||||
return x.length;
|
||||
}
|
||||
}
|
||||
// ====
|
||||
// compileViaYul: also
|
||||
// ----
|
||||
// f(uint256[]): 0x20, 0 -> 0
|
||||
// f(uint256[]): 0x20, 1, 23 -> 1
|
||||
// f(uint256[]): 0x20, 2, 23, 42 -> 2
|
||||
// f(uint256[]): 0x20, 3, 23, 42, 17 -> 3
|
||||
// f(uint256[2]): 23, 42 -> 2
|
||||
// f(uint256[][]): 0x20, 0 -> 0, 0, 0
|
||||
// f(uint256[][]): 0x20, 1, 0x20, 0 -> 1, 0, 0
|
||||
// f(uint256[][]): 0x20, 1, 0x00 -> 1, 0, 0
|
||||
// f(uint256[][]): 0x20, 1, 0x20, 1, 23 -> 1, 1, 0
|
||||
// f(uint256[][]): 0x20, 1, 0x20, 2, 23, 42 -> 1, 2, 0
|
||||
// f(uint256[][]): 0x20, 1, 0x40, 0, 2, 23, 42 -> 1, 2, 0
|
||||
// f(uint256[][]): 0x20, 1, -32 -> 1, 1, 0
|
||||
// f(uint256[][]): 0x20, 2, 0x40, 0x40, 2, 23, 42 -> 2, 2, 2
|
||||
// f(uint256[][]): 0x20, 2, 0x40, 0xa0, 2, 23, 42, 0 -> 2, 2, 0
|
||||
// f(uint256[][]): 0x20, 2, 0xA0, 0x40, 2, 23, 42, 0 -> 2, 0, 2
|
||||
// f(uint256[][]): 0x20, 2, 0x40, 0xA0, 2, 23, 42, 1, 17 -> 2, 2, 1
|
||||
// f(uint256[][]): 0x20, 2, 0x40, 0xA0, 2, 23, 42, 2, 17, 13 -> 2, 2, 2
|
||||
@@ -0,0 +1,20 @@
|
||||
pragma experimental ABIEncoderV2;
|
||||
|
||||
contract C {
|
||||
function f(uint256[][2][] calldata x, uint256 i, uint256 j, uint256 k) external returns (uint256 a, uint256 b, uint256 c, uint256 d) {
|
||||
a = x.length;
|
||||
b = x[i].length;
|
||||
c = x[i][j].length;
|
||||
d = x[i][j][k];
|
||||
}
|
||||
}
|
||||
// ====
|
||||
// compileViaYul: also
|
||||
// ----
|
||||
// f(uint256[][2][],uint256,uint256,uint256): 0x80, 0, 0, 0, 1, 0x20, 0x40, 0x80, 1, 42, 1, 23 -> 1, 2, 1, 42
|
||||
// f(uint256[][2][],uint256,uint256,uint256): 0x80, 0, 1, 0, 1, 0x20, 0x40, 0x80, 1, 42, 1, 23 -> 1, 2, 1, 23
|
||||
// f(uint256[][2][],uint256,uint256,uint256): 0x80, 0, 1, 0, 1, 0x20, 0x40, 0x80, 1, 42, 2, 23, 17 -> 1, 2, 2, 23
|
||||
// f(uint256[][2][],uint256,uint256,uint256): 0x80, 0, 1, 1, 1, 0x20, 0x40, 0x80, 1, 42, 2, 23, 17 -> 1, 2, 2, 17
|
||||
// f(uint256[][2][],uint256,uint256,uint256): 0x80, 1, 0, 0, 1, 0x20, 0x40, 0x80, 1, 42, 1, 23 -> FAILURE
|
||||
// f(uint256[][2][],uint256,uint256,uint256): 0x80, 0, 2, 0, 1, 0x20, 0x40, 0x80, 1, 42, 1, 23 -> FAILURE
|
||||
// f(uint256[][2][],uint256,uint256,uint256): 0x80, 0, 2, 0, 1, 0x20, 0x40, 0x80, 1, 42, 1, 23 -> FAILURE
|
||||
@@ -0,0 +1,12 @@
|
||||
pragma experimental ABIEncoderV2;
|
||||
contract C {
|
||||
function f(bytes[] calldata a, uint256 i) external returns (uint) {
|
||||
return uint8(a[0][i]);
|
||||
}
|
||||
}
|
||||
// ====
|
||||
// compileViaYul: also
|
||||
// ----
|
||||
// f(bytes[],uint256): 0x40, 0, 1, 0x20, 2, hex"6162" -> 0x61
|
||||
// f(bytes[],uint256): 0x40, 1, 1, 0x20, 2, hex"6162" -> 0x62
|
||||
// f(bytes[],uint256): 0x40, 2, 1, 0x20, 2, hex"6162" -> FAILURE
|
||||
Reference in New Issue
Block a user