mirror of
				https://github.com/ethereum/solidity
				synced 2023-10-03 13:03:40 +00:00 
			
		
		
		
	Add test for copying reference types between data locations
This commit is contained in:
		
							parent
							
								
									548a4b4ac6
								
							
						
					
					
						commit
						c5d8c5ad05
					
				| @ -0,0 +1,45 @@ | |||||||
|  | pragma abicoder v2; | ||||||
|  | 
 | ||||||
|  | contract C { | ||||||
|  |     uint256[][] a1; | ||||||
|  |     uint256[][2] a2; | ||||||
|  |     uint256[2][] a3; | ||||||
|  |     uint256[2][2] a4; | ||||||
|  | 
 | ||||||
|  |     constructor() { | ||||||
|  |         a1 = new uint256[][](2); | ||||||
|  |         a1[0] = [1, 2]; | ||||||
|  |         a1[1] = [3, 4, 5]; | ||||||
|  | 
 | ||||||
|  |         a2[0] = [6, 7, 8]; | ||||||
|  |         a2[1] = [9]; | ||||||
|  | 
 | ||||||
|  |         a3.push([1, 2]); | ||||||
|  |         a3.push([3, 4]); | ||||||
|  |         a3.push([5, 6]); | ||||||
|  | 
 | ||||||
|  |         a4 = [[10, 11], [12, 13]]; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function test1() external returns (uint256[][] memory) { | ||||||
|  |         return a1; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function test2() external returns (uint256[][2] memory) { | ||||||
|  |         return a2; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function test3() external returns (uint256[2][] memory) { | ||||||
|  |         return a3; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function test4() external returns (uint256[2][2] memory) { | ||||||
|  |         return a4; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // ---- | ||||||
|  | // test1() -> 0x20, 2, 0x40, 0xa0, 2, 1, 2, 3, 3, 4, 5 | ||||||
|  | // test2() -> 0x20, 0x40, 0xc0, 3, 6, 7, 8, 1, 9 | ||||||
|  | // test3() -> 0x20, 3, 1, 2, 3, 4, 5, 6 | ||||||
|  | // test4() -> 10, 11, 12, 13 | ||||||
| @ -0,0 +1,61 @@ | |||||||
|  | pragma abicoder v2; | ||||||
|  | 
 | ||||||
|  | contract C { | ||||||
|  |     mapping (uint => uint8[][]) m; | ||||||
|  | 
 | ||||||
|  |     uint8[][] s; | ||||||
|  | 
 | ||||||
|  |     constructor() { | ||||||
|  |         s = new uint8[][](2); | ||||||
|  | 
 | ||||||
|  |         s[0] = new uint8[](2); | ||||||
|  |         s[0][0] = 10; | ||||||
|  |         s[0][1] = 11; | ||||||
|  | 
 | ||||||
|  |         s[1] = new uint8[](3); | ||||||
|  |         s[1][0] = 12; | ||||||
|  |         s[1][1] = 13; | ||||||
|  |         s[1][2] = 14; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function from_storage() public returns (uint8[][] memory) { | ||||||
|  |         m[0] = new uint8[][](2); | ||||||
|  |         m[0][0] = s[0]; | ||||||
|  |         m[0][1] = s[1]; | ||||||
|  |         return m[0]; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     function from_storage_ptr() public returns (uint8[][] memory) { | ||||||
|  |         uint8[][] storage sPtr = s; | ||||||
|  |         m[0] = new uint8[][](2); | ||||||
|  |         m[0][0] = sPtr[0]; | ||||||
|  |         m[0][1] = sPtr[1]; | ||||||
|  |         return m[0]; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     function from_memory() public returns (uint8[][] memory) { | ||||||
|  |         uint8[][] memory a = s; | ||||||
|  |         m[0] = new uint8[][](2); | ||||||
|  |         m[0][0] = a[0]; | ||||||
|  |         m[0][1] = a[1]; | ||||||
|  |         return m[0]; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function from_calldata(uint8[][] calldata _a) public returns (uint8[][] memory) { | ||||||
|  |         m[0] = new uint8[][](2); | ||||||
|  |         m[0][0] = _a[0]; | ||||||
|  |         m[0][1] = _a[1]; | ||||||
|  |         return m[0]; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // ---- | ||||||
|  | // from_storage() -> 0x20, 2, 0x40, 0xa0, 2, 10, 11, 3, 12, 13, 14 | ||||||
|  | // gas irOptimized: 150098 | ||||||
|  | // gas legacy: 150830 | ||||||
|  | // gas legacyOptimized: 148728 | ||||||
|  | // from_storage_ptr() -> 0x20, 2, 0x40, 0xa0, 2, 10, 11, 3, 12, 13, 14 | ||||||
|  | // from_memory() -> 0x20, 2, 0x40, 0xa0, 2, 10, 11, 3, 12, 13, 14 | ||||||
|  | // from_calldata(uint8[][]): 0x20, 2, 0x40, 0xa0, 2, 10, 11, 3, 12, 13, 14 -> 0x20, 2, 0x40, 0xa0, 2, 10, 11, 3, 12, 13, 14 | ||||||
| @ -0,0 +1,45 @@ | |||||||
|  | pragma abicoder v2; | ||||||
|  | 
 | ||||||
|  | contract C { | ||||||
|  |     mapping (uint => uint8[][]) m; | ||||||
|  | 
 | ||||||
|  |     uint8[][] s; | ||||||
|  | 
 | ||||||
|  |     constructor() { | ||||||
|  |         s = new uint8[][](2); | ||||||
|  | 
 | ||||||
|  |         s[0] = new uint8[](2); | ||||||
|  |         s[0][0] = 10; | ||||||
|  |         s[0][1] = 11; | ||||||
|  | 
 | ||||||
|  |         s[1] = new uint8[](3); | ||||||
|  |         s[1][0] = 12; | ||||||
|  |         s[1][1] = 13; | ||||||
|  |         s[1][2] = 14; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function from_storage() public returns (uint8[][] memory) { | ||||||
|  |         m[0] = s; | ||||||
|  |         return m[0]; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function from_storage_ptr() public returns (uint8[][] memory) { | ||||||
|  |         uint8[][] storage sPtr = s; | ||||||
|  |         m[0] = sPtr; | ||||||
|  |         return m[0]; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function from_memory() public returns (uint8[][] memory) { | ||||||
|  |         uint8[][] memory a = s; | ||||||
|  |         m[0] = a; | ||||||
|  |         return m[0]; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // ---- | ||||||
|  | // from_storage() -> 0x20, 2, 0x40, 0xa0, 2, 10, 11, 3, 12, 13, 14 | ||||||
|  | // gas irOptimized: 147913 | ||||||
|  | // gas legacy: 148965 | ||||||
|  | // gas legacyOptimized: 146935 | ||||||
|  | // from_storage_ptr() -> 0x20, 2, 0x40, 0xa0, 2, 10, 11, 3, 12, 13, 14 | ||||||
|  | // from_memory() -> 0x20, 2, 0x40, 0xa0, 2, 10, 11, 3, 12, 13, 14 | ||||||
| @ -0,0 +1,18 @@ | |||||||
|  | pragma abicoder v2; | ||||||
|  | 
 | ||||||
|  | contract C { | ||||||
|  |     mapping (uint => uint8[][]) m; | ||||||
|  | 
 | ||||||
|  |     uint8[][] s; | ||||||
|  | 
 | ||||||
|  |     function from_calldata(uint8[][] calldata _a) public returns (uint8[][] memory) { | ||||||
|  |         m[0] = _a; | ||||||
|  |         return m[0]; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // ==== | ||||||
|  | // compileViaYul: true | ||||||
|  | // ---- | ||||||
|  | // from_calldata(uint8[][]): 0x20, 2, 0x40, 0xa0, 2, 10, 11, 3, 12, 13, 14 -> 0x20, 2, 0x40, 0xa0, 2, 10, 11, 3, 12, 13, 14 | ||||||
|  | // gas irOptimized: 139927 | ||||||
| @ -0,0 +1,40 @@ | |||||||
|  | pragma abicoder v2; | ||||||
|  | 
 | ||||||
|  | contract C { | ||||||
|  |     struct S { | ||||||
|  |         uint8[] a; | ||||||
|  |         uint8[2] b; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     S[][][] s1; | ||||||
|  |     S[][1][] s2; | ||||||
|  |     S[1][][1] s3; | ||||||
|  | 
 | ||||||
|  |     function test1(S[][][] calldata _a) public returns (S[][] memory){ | ||||||
|  |         s1.push(); | ||||||
|  |         s1[0] = _a[0]; | ||||||
|  |         return s1[0]; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function test2(S[][1][] calldata _a) public returns (S[][1] memory) { | ||||||
|  |         s2.push(); | ||||||
|  |         s2[0] = _a[0]; | ||||||
|  |         return s2[0]; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function test3(S[1][][2] calldata _a) public returns (S[1][] memory) { | ||||||
|  |         s3[0] = _a[1]; | ||||||
|  |         return s3[0]; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | // ==== | ||||||
|  | // compileViaYul: true | ||||||
|  | // ---- | ||||||
|  | // test1((uint8[],uint8[2])[][][]): 0x20, 1, 0x20, 2, 0x40, 0x0140, 1, 0x20, 0x60, 3, 7, 2, 1, 2, 2, 0x40, 0x0100, 0x60, 17, 19, 2, 11, 13, 0x60, 31, 37, 2, 23, 29 -> 0x20, 2, 0x40, 0x0140, 1, 0x20, 0x60, 3, 7, 2, 1, 2, 2, 0x40, 0x0100, 0x60, 17, 19, 2, 11, 13, 0x60, 31, 37, 2, 23, 29 | ||||||
|  | // gas irOptimized: 327878 | ||||||
|  | // test2((uint8[],uint8[2])[][1][]): 0x20, 2, 0x40, 0x0160, 0x20, 1, 0x20, 0x60, 17, 19, 2, 11, 13, 0x20, 1, 0x20, 0x60, 31, 37, 2, 23, 29 -> 0x20, 0x20, 1, 0x20, 0x60, 17, 19, 2, 11, 13 | ||||||
|  | // gas irOptimized: 140894 | ||||||
|  | // test3((uint8[],uint8[2])[1][][2]): 0x20, 0x40, 0x60, 0, 2, 0x40, 288, 0x20, 0x60, 3, 7, 2, 1, 2, 0x20, 0x60, 17, 19, 2, 11, 13 -> 0x20, 2, 0x40, 288, 0x20, 0x60, 3, 7, 2, 1, 2, 0x20, 0x60, 17, 19, 2, 11, 13 | ||||||
|  | // gas irOptimized: 188509 | ||||||
| @ -0,0 +1,40 @@ | |||||||
|  | pragma abicoder v2; | ||||||
|  | 
 | ||||||
|  | contract C { | ||||||
|  |     struct S { | ||||||
|  |         uint8[] a; | ||||||
|  |         uint8[2] b; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     S[][][] s1; | ||||||
|  |     S[][1][] s2; | ||||||
|  |     S[1][][1] s3; | ||||||
|  | 
 | ||||||
|  |     function test1(S[][][] memory _a) public returns (S[][] memory){ | ||||||
|  |         s1.push(); | ||||||
|  |         s1[0] = _a[0]; | ||||||
|  |         return s1[0]; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function test2(S[][1][] memory _a) public returns (S[][1] memory) { | ||||||
|  |         s2.push(); | ||||||
|  |         s2[0] = _a[0]; | ||||||
|  |         return s2[0]; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function test3(S[1][][2] memory _a) public returns (S[1][] memory) { | ||||||
|  |         s3[0] = _a[1]; | ||||||
|  |         return s3[0]; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | // ==== | ||||||
|  | // compileViaYul: true | ||||||
|  | // ---- | ||||||
|  | // test1((uint8[],uint8[2])[][][]): 0x20, 1, 0x20, 2, 0x40, 0x0140, 1, 0x20, 0x60, 3, 7, 2, 1, 2, 2, 0x40, 0x0100, 0x60, 17, 19, 2, 11, 13, 0x60, 31, 37, 2, 23, 29 -> 0x20, 2, 0x40, 0x0140, 1, 0x20, 0x60, 3, 7, 2, 1, 2, 2, 0x40, 0x0100, 0x60, 17, 19, 2, 11, 13, 0x60, 31, 37, 2, 23, 29 | ||||||
|  | // gas irOptimized: 332334 | ||||||
|  | // test2((uint8[],uint8[2])[][1][]): 0x20, 2, 0x40, 0x0160, 0x20, 1, 0x20, 0x60, 17, 19, 2, 11, 13, 0x20, 1, 0x20, 0x60, 31, 37, 2, 23, 29 -> 0x20, 0x20, 1, 0x20, 0x60, 17, 19, 2, 11, 13 | ||||||
|  | // gas irOptimized: 145029 | ||||||
|  | // test3((uint8[],uint8[2])[1][][2]): 0x20, 0x40, 0x60, 0, 2, 0x40, 288, 0x20, 0x60, 3, 7, 2, 1, 2, 0x20, 0x60, 17, 19, 2, 11, 13 -> 0x20, 2, 0x40, 288, 0x20, 0x60, 3, 7, 2, 1, 2, 0x20, 0x60, 17, 19, 2, 11, 13 | ||||||
|  | // gas irOptimized: 192344 | ||||||
| @ -0,0 +1,41 @@ | |||||||
|  | pragma abicoder v2; | ||||||
|  | 
 | ||||||
|  | contract C { | ||||||
|  |     function test1(uint8[][][] calldata _a) public returns (uint8[][] memory) { | ||||||
|  |         return _a[1]; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function test2(uint8[][1][] calldata _a) public returns (uint8[][1] memory) { | ||||||
|  |         return _a[0]; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function test3(uint8[2][][2] calldata _a) public returns (uint8[2][] memory) { | ||||||
|  |         return _a[0]; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function test4(uint16[][] calldata _a) public returns (uint16[][] memory) { | ||||||
|  |         uint16[][][] memory tmp = new uint16[][][](2); | ||||||
|  |         tmp[1] = _a; | ||||||
|  |         return tmp[1]; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function test5(uint32[][2] calldata _a) public returns (uint32[][2] memory) { | ||||||
|  |         uint32[][2][] memory tmp = new uint32[][2][](1); | ||||||
|  |         tmp[0] = _a; | ||||||
|  |         return tmp[0]; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function test6(uint32[2][] calldata _a) public returns (uint32[2][] memory) { | ||||||
|  |         uint32[2][][] memory tmp = new uint32[2][][](1); | ||||||
|  |         tmp[0] = _a; | ||||||
|  |         return tmp[0]; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // ---- | ||||||
|  | // test1(uint8[][][]): 0x20, 2, 0x40, 0x60, 0, 2, 0x40, 0x80, 1, 7, 2, 8, 9 -> 0x20, 2, 0x40, 0x80, 1, 7, 2, 8, 9 | ||||||
|  | // test2(uint8[][1][]): 0x20, 2, 0x40, 0xe0, 0x20, 3, 12, 13, 14, 0x20, 3, 15, 16, 17 -> 0x20, 0x20, 3, 12, 13, 14 | ||||||
|  | // test3(uint8[2][][2]): 0x20, 0x40, 0xa0, 1, 7, 7, 2, 8, 8, 0x09, 9 -> 0x20, 1, 7, 7 | ||||||
|  | // test4(uint16[][]): 0x20, 2, 0x40, 0x80, 1, 7, 2, 8, 9 -> 0x20, 2, 0x40, 0x80, 1, 7, 2, 8, 9 | ||||||
|  | // test5(uint32[][2]): 0x20, 0x40, 0x80, 1, 7, 2, 8, 9 -> 0x20, 0x40, 0x80, 1, 7, 2, 8, 9 | ||||||
|  | // test6(uint32[2][]): 0x20, 2, 5, 6, 7, 8 -> 0x20, 2, 5, 6, 7, 8 | ||||||
| @ -0,0 +1,30 @@ | |||||||
|  | contract C { | ||||||
|  |     uint8[2][2] a; | ||||||
|  |     uint8[2][2][2] a2; | ||||||
|  | 
 | ||||||
|  |     function test(uint8[2][2][2] calldata _a) public { | ||||||
|  |         a = _a[0]; | ||||||
|  |         require(a[0][0] == 1); | ||||||
|  |         require(a[0][1] == 2); | ||||||
|  |         require(a[1][0] == 3); | ||||||
|  |         require(a[1][1] == 4); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function test2(uint8[2][2] calldata _a) public { | ||||||
|  |         a2[0] = _a; | ||||||
|  |         require(a2[0][0][0] == 1); | ||||||
|  |         require(a2[0][0][1] == 2); | ||||||
|  |         require(a2[0][1][0] == 3); | ||||||
|  |         require(a2[0][1][1] == 4); | ||||||
|  |         require(a2[1][0][0] == 0); | ||||||
|  |         require(a2[1][0][1] == 0); | ||||||
|  |         require(a2[1][1][0] == 0); | ||||||
|  |         require(a2[1][1][1] == 0); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // ---- | ||||||
|  | // test(uint8[2][2][2]): 1, 2, 3, 4, 5, 6, 7, 8 | ||||||
|  | // test2(uint8[2][2]): 1, 2, 3, 4 | ||||||
|  | // gas irOptimized: 119939 | ||||||
|  | // gas legacyOptimized: 120228 | ||||||
| @ -0,0 +1,41 @@ | |||||||
|  | pragma abicoder v2; | ||||||
|  | 
 | ||||||
|  | contract C { | ||||||
|  |     function test1(uint8[][][] memory _a) public returns (uint8[][] memory) { | ||||||
|  |         return _a[1]; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function test2(uint8[][1][] memory _a) public returns (uint8[][1] memory) { | ||||||
|  |         return _a[0]; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function test3(uint8[2][][2] memory _a) public returns (uint8[2][] memory) { | ||||||
|  |         return _a[0]; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function test4(uint16[][] memory _a) public returns (uint16[][] memory) { | ||||||
|  |         uint16[][][] memory tmp = new uint16[][][](2); | ||||||
|  |         tmp[1] = _a; | ||||||
|  |         return tmp[1]; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function test5(uint32[][2] memory _a) public returns (uint32[][2] memory) { | ||||||
|  |         uint32[][2][] memory tmp = new uint32[][2][](1); | ||||||
|  |         tmp[0] = _a; | ||||||
|  |         return tmp[0]; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function test6(uint32[2][] memory _a) public returns (uint32[2][] memory) { | ||||||
|  |         uint32[2][][] memory tmp = new uint32[2][][](1); | ||||||
|  |         tmp[0] = _a; | ||||||
|  |         return tmp[0]; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // ---- | ||||||
|  | // test1(uint8[][][]): 0x20, 2, 0x40, 0x60, 0, 2, 0x40, 0x80, 1, 7, 2, 8, 9 -> 0x20, 2, 0x40, 0x80, 1, 7, 2, 8, 9 | ||||||
|  | // test2(uint8[][1][]): 0x20, 2, 0x40, 0xe0, 0x20, 3, 12, 13, 14, 0x20, 3, 15, 16, 17 -> 0x20, 0x20, 3, 12, 13, 14 | ||||||
|  | // test3(uint8[2][][2]): 0x20, 0x40, 0xa0, 1, 7, 7, 2, 8, 8, 0x09, 9 -> 0x20, 1, 7, 7 | ||||||
|  | // test4(uint16[][]): 0x20, 2, 0x40, 0x80, 1, 7, 2, 8, 9 -> 0x20, 2, 0x40, 0x80, 1, 7, 2, 8, 9 | ||||||
|  | // test5(uint32[][2]): 0x20, 0x40, 0x80, 1, 7, 2, 8, 9 -> 0x20, 0x40, 0x80, 1, 7, 2, 8, 9 | ||||||
|  | // test6(uint32[2][]): 0x20, 2, 5, 6, 7, 8 -> 0x20, 2, 5, 6, 7, 8 | ||||||
| @ -0,0 +1,30 @@ | |||||||
|  | contract C { | ||||||
|  |     uint8[2][2] a1; | ||||||
|  |     uint8[2][2][2] a2; | ||||||
|  | 
 | ||||||
|  |     function test(uint8[2][2][2] memory _a) public { | ||||||
|  |         a1 = _a[0]; | ||||||
|  |         require(a1[0][0] == 1); | ||||||
|  |         require(a1[0][1] == 2); | ||||||
|  |         require(a1[1][0] == 3); | ||||||
|  |         require(a1[1][1] == 4); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function test2(uint8[2][2] memory _a) public { | ||||||
|  |         a2[0] = _a; | ||||||
|  |         require(a2[0][0][0] == 1); | ||||||
|  |         require(a2[0][0][1] == 2); | ||||||
|  |         require(a2[0][1][0] == 3); | ||||||
|  |         require(a2[0][1][1] == 4); | ||||||
|  |         require(a2[1][0][0] == 0); | ||||||
|  |         require(a2[1][0][1] == 0); | ||||||
|  |         require(a2[1][1][0] == 0); | ||||||
|  |         require(a2[1][1][1] == 0); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // ---- | ||||||
|  | // test(uint8[2][2][2]): 1, 2, 3, 4, 5, 6, 7, 8 | ||||||
|  | // test2(uint8[2][2]): 1, 2, 3, 4 | ||||||
|  | // gas irOptimized: 119939 | ||||||
|  | // gas legacyOptimized: 120228 | ||||||
| @ -0,0 +1,71 @@ | |||||||
|  | pragma abicoder v2; | ||||||
|  | 
 | ||||||
|  | contract C { | ||||||
|  |     uint8[][][] a1 = new uint8[][][](2); | ||||||
|  |     uint8[][][2] a2; | ||||||
|  |     uint8[][2][] a3 = new uint8[][2][](1); | ||||||
|  |     uint8[2][][] a4 = new uint8[2][][](2); | ||||||
|  | 
 | ||||||
|  |     constructor() { | ||||||
|  |         a1[1] = new uint8[][](2); | ||||||
|  |         a1[1][0] = [3, 4]; | ||||||
|  |         a1[1][1] = [5, 6]; | ||||||
|  | 
 | ||||||
|  |         a2[0] = new uint8[][](2); | ||||||
|  |         a2[0][0] = [6, 7]; | ||||||
|  |         a2[0][1] = [8, 9]; | ||||||
|  |         a2[1] = new uint8[][](2); | ||||||
|  |         a2[1][0] = [10, 11]; | ||||||
|  | 
 | ||||||
|  |         a3[0][0] = [3, 4]; | ||||||
|  |         a3[0][1] = [5, 6]; | ||||||
|  | 
 | ||||||
|  |         a4[0] = new uint8[2][](1); | ||||||
|  |         a4[0][0] = [17, 23]; | ||||||
|  |         a4[1] = new uint8[2][](1); | ||||||
|  |         a4[1][0] = [19, 31]; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function test1() public returns (uint8[][] memory) { | ||||||
|  |         return a1[1]; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function test2() public returns (uint8[][] memory) { | ||||||
|  |         return a2[0]; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function test3() public returns (uint8[][2] memory) { | ||||||
|  |         return a3[0]; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function test4() public returns (uint8[2][] memory) { | ||||||
|  |         return a4[1]; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function test5() public returns (uint8[][][] memory) { | ||||||
|  |         uint8[][][] memory tmp = new uint8[][][](3); | ||||||
|  |         tmp[1] = a1[1]; | ||||||
|  |         return tmp; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function test6() public returns (uint8[][2][] memory) { | ||||||
|  |         uint8[][2][] memory tmp = new uint8[][2][](2); | ||||||
|  |         tmp[0] = a3[0]; | ||||||
|  |         return tmp; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function test7() public returns (uint8[2][][] memory) { | ||||||
|  |         uint8[2][][] memory tmp = new uint8[2][][](1); | ||||||
|  |         tmp[0] = a4[0]; | ||||||
|  |         return tmp; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // ---- | ||||||
|  | // test1() -> 0x20, 2, 0x40, 0xa0, 2, 3, 4, 2, 5, 6 | ||||||
|  | // test2() -> 0x20, 2, 0x40, 0xa0, 2, 6, 7, 2, 8, 9 | ||||||
|  | // test3() -> 0x20, 0x40, 0xa0, 2, 3, 4, 2, 5, 6 | ||||||
|  | // test4() -> 0x20, 1, 19, 31 | ||||||
|  | // test5() -> 0x20, 3, 0x60, 0x80, 0x01a0, 0, 2, 0x40, 0xa0, 2, 3, 4, 2, 5, 6, 0 | ||||||
|  | // test6() -> 0x20, 2, 0x40, 0x0140, 0x40, 0xa0, 2, 3, 4, 2, 5, 6, 0x40, 0x60, 0, 0 | ||||||
|  | // test7() -> 0x20, 1, 0x20, 1, 17, 23 | ||||||
| @ -0,0 +1,55 @@ | |||||||
|  | contract C { | ||||||
|  |     uint8[][][] src1 = new uint8[][][](2); | ||||||
|  |     uint8[][2][] src2 = new uint8[][2][](1); | ||||||
|  |     uint8[2][][] src3 = new uint8[2][][](2); | ||||||
|  | 
 | ||||||
|  |     uint8[][][1] dst1; | ||||||
|  |     uint8[][2][] dst2; | ||||||
|  |     uint8[2][] dst3; | ||||||
|  | 
 | ||||||
|  |     constructor() { | ||||||
|  |         src1[1] = new uint8[][](2); | ||||||
|  |         src1[1][0] = [3, 4]; | ||||||
|  |         src1[1][1] = [5, 6]; | ||||||
|  | 
 | ||||||
|  |         src2[0][0] = [3, 4]; | ||||||
|  |         src2[0][1] = [5, 6]; | ||||||
|  | 
 | ||||||
|  |         src3[0] = new uint8[2][](1); | ||||||
|  |         src3[0][0] = [17, 23]; | ||||||
|  |         src3[1] = new uint8[2][](1); | ||||||
|  |         src3[1][0] = [19, 31]; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function test1() public { | ||||||
|  | 	dst1[0] = src1[1]; | ||||||
|  |         require(dst1[0].length == 2); | ||||||
|  | 	require(dst1[0][0][0] == src1[1][0][0]); | ||||||
|  |         require(dst1[0][1][1] == src1[1][1][1]); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function test2() public { | ||||||
|  |         dst2.push(); | ||||||
|  | 	dst2[0][0] = src2[0][0]; | ||||||
|  |         dst2[0][1] = src2[0][1]; | ||||||
|  |         require(dst2[0][0][0] == src2[0][0][0]); | ||||||
|  |         require(dst2[0][0][1] == src2[0][0][1]); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function test3() public { | ||||||
|  |         dst3 = src3[1]; | ||||||
|  |         require(dst3[0][0] == src3[1][0][0]); | ||||||
|  |         require(dst3[0][0] == src3[1][0][0]); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // ---- | ||||||
|  | // test1() | ||||||
|  | // gas irOptimized: 147595 | ||||||
|  | // gas legacy: 148507 | ||||||
|  | // gas legacyOptimized: 148336 | ||||||
|  | // test2() | ||||||
|  | // gas irOptimized: 145663 | ||||||
|  | // gas legacy: 146311 | ||||||
|  | // gas legacyOptimized: 146106 | ||||||
|  | // test3() | ||||||
| @ -0,0 +1,38 @@ | |||||||
|  | pragma abicoder v2; | ||||||
|  | 
 | ||||||
|  | contract C { | ||||||
|  |     struct S { | ||||||
|  |         uint8[] a; | ||||||
|  |         uint8[2] b; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     S[][] s1; | ||||||
|  |     S[][1] s2; | ||||||
|  |     S[1][] s3; | ||||||
|  | 
 | ||||||
|  |     function test1(S[][] calldata _a) public returns (S[][] memory){ | ||||||
|  |         s1 = _a; | ||||||
|  |         return s1; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function test2(S[][1] calldata _a) public returns (S[][1] memory) { | ||||||
|  |         s2 = _a; | ||||||
|  |         return s2; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function test3(S[1][] calldata _a) public returns (S[1][] memory) { | ||||||
|  |         s3 = _a; | ||||||
|  |         return s3; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | // ==== | ||||||
|  | // compileViaYul: true | ||||||
|  | // ---- | ||||||
|  | // test1((uint8[],uint8[2])[][]): 0x20, 2, 0x40, 0x0140, 1, 0x20, 0x60, 3, 7, 2, 1, 2, 2, 0x40, 0x0100, 0x60, 17, 19, 2, 11, 13, 0x60, 31, 37, 2, 23, 29 -> 0x20, 2, 0x40, 0x0140, 1, 0x20, 0x60, 3, 7, 2, 1, 2, 2, 0x40, 0x0100, 0x60, 17, 19, 2, 11, 13, 0x60, 31, 37, 2, 23, 29 | ||||||
|  | // gas irOptimized: 304768 | ||||||
|  | // test2((uint8[],uint8[2])[][1]): 0x20, 0x20, 1, 0x20, 0x60, 17, 19, 2, 11, 13 -> 0x20, 0x20, 1, 0x20, 0x60, 17, 19, 2, 11, 13 | ||||||
|  | // gas irOptimized: 116476 | ||||||
|  | // test3((uint8[],uint8[2])[1][]): 0x20, 2, 0x40, 0x0120, 0x20, 0x60, 3, 7, 2, 1, 2, 0x20, 0x60, 17, 19, 2, 11, 13 -> 0x20, 2, 0x40, 0x0120, 0x20, 0x60, 3, 7, 2, 1, 2, 0x20, 0x60, 17, 19, 2, 11, 13 | ||||||
|  | // gas irOptimized: 187998 | ||||||
| @ -0,0 +1,38 @@ | |||||||
|  | pragma abicoder v2; | ||||||
|  | 
 | ||||||
|  | contract C { | ||||||
|  |     struct S { | ||||||
|  |         uint8[] a; | ||||||
|  |         uint8[2] b; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     S[][] s1; | ||||||
|  |     S[][1] s2; | ||||||
|  |     S[1][] s3; | ||||||
|  | 
 | ||||||
|  |     function test1(S[][] memory _a) public returns (S[][] memory){ | ||||||
|  |         s1 = _a; | ||||||
|  |         return s1; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function test2(S[][1] memory _a) public returns (S[][1] memory) { | ||||||
|  |         s2 = _a; | ||||||
|  |         return s2; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function test3(S[1][] memory _a) public returns (S[1][] memory) { | ||||||
|  |         s3 = _a; | ||||||
|  |         return s3; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | // ==== | ||||||
|  | // compileViaYul: true | ||||||
|  | // ---- | ||||||
|  | // test1((uint8[],uint8[2])[][]): 0x20, 2, 0x40, 0x0140, 1, 0x20, 0x60, 3, 7, 2, 1, 2, 2, 0x40, 0x0100, 0x60, 17, 19, 2, 11, 13, 0x60, 31, 37, 2, 23, 29 -> 0x20, 2, 0x40, 0x0140, 1, 0x20, 0x60, 3, 7, 2, 1, 2, 2, 0x40, 0x0100, 0x60, 17, 19, 2, 11, 13, 0x60, 31, 37, 2, 23, 29 | ||||||
|  | // gas irOptimized: 308790 | ||||||
|  | // test2((uint8[],uint8[2])[][1]): 0x20, 0x20, 1, 0x20, 0x60, 17, 19, 2, 11, 13 -> 0x20, 0x20, 1, 0x20, 0x60, 17, 19, 2, 11, 13 | ||||||
|  | // gas irOptimized: 118077 | ||||||
|  | // test3((uint8[],uint8[2])[1][]): 0x20, 2, 0x40, 0x0120, 0x20, 0x60, 3, 7, 2, 1, 2, 0x20, 0x60, 17, 19, 2, 11, 13 -> 0x20, 2, 0x40, 0x0120, 0x20, 0x60, 3, 7, 2, 1, 2, 0x20, 0x60, 17, 19, 2, 11, 13 | ||||||
|  | // gas irOptimized: 190775 | ||||||
| @ -0,0 +1,45 @@ | |||||||
|  | pragma abicoder v2; | ||||||
|  | 
 | ||||||
|  | contract C { | ||||||
|  |     struct S { | ||||||
|  |         uint8[] a; | ||||||
|  |         uint8[2] b; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     uint8[] a1; | ||||||
|  |     uint8[] a2; | ||||||
|  |     uint8[] a3; | ||||||
|  | 
 | ||||||
|  |     S[][] s1; | ||||||
|  |     S[1][1] s2; | ||||||
|  | 
 | ||||||
|  |     constructor() { | ||||||
|  |         a1.push(23); | ||||||
|  |         a1.push(29); | ||||||
|  |         a2.push(31); | ||||||
|  | 
 | ||||||
|  |         s1 = new S[][](2); | ||||||
|  |         s1[0] = new S[](2); | ||||||
|  |         s1[0][0] = S({a: a1, b: [7, 11]}); | ||||||
|  |         s1[0][1] = S({a: a2, b: [17, 19]}); | ||||||
|  | 
 | ||||||
|  |         s1[1] = new S[](1); | ||||||
|  |         s1[1][0] = S({a: a3, b: [37, 41]}); | ||||||
|  | 
 | ||||||
|  |         s2[0][0] = S({a: a3, b: [43, 47]}); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function test1() public returns (S[] memory) { | ||||||
|  |         return s1[0]; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function test2() public returns (S[1] memory) { | ||||||
|  |         return s2[0]; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // ==== | ||||||
|  | // compileViaYul: true | ||||||
|  | // ---- | ||||||
|  | // test1() -> 0x20, 2, 0x40, 0x0100, 0x60, 7, 11, 2, 23, 29, 0x60, 17, 19, 1, 31 | ||||||
|  | // test2() -> 0x20, 0x20, 0x60, 43, 47, 0 | ||||||
| @ -0,0 +1,37 @@ | |||||||
|  | pragma abicoder v2; | ||||||
|  | 
 | ||||||
|  | contract C { | ||||||
|  |     uint8[][] a; | ||||||
|  |     uint8[][][] a2; | ||||||
|  | 
 | ||||||
|  |     function test(uint8[][][] calldata _a) public { | ||||||
|  |         a = _a[1]; | ||||||
|  |         require(a.length == 2); | ||||||
|  |         require(a[0].length == 1); | ||||||
|  |         require(a[0][0] == 7); | ||||||
|  |         require(a[1].length == 2); | ||||||
|  |         require(a[1][0] == 8); | ||||||
|  |         require(a[1][1] == 9); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function test2(uint8[][] calldata _a) public { | ||||||
|  |         a2 = new uint8[][][](2); | ||||||
|  |         a2[0] = _a; | ||||||
|  |         require(a2[0].length == 2); | ||||||
|  | 	require(a2[0][0].length == 1); | ||||||
|  | 	require(a2[0][0][0] == 7); | ||||||
|  | 	require(a2[0][1].length == 2); | ||||||
|  | 	require(a2[0][1][0] == 8); | ||||||
|  | 	require(a2[0][1][1] == 9); | ||||||
|  | 	require(a2[1].length == 0); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // ==== | ||||||
|  | // compileViaYul: true | ||||||
|  | // ---- | ||||||
|  | // test(uint8[][][]): 0x20, 2, 0x40, 0x60, 0, 2, 0x40, 0x80, 1, 7, 2, 8, 9 | ||||||
|  | // gas irOptimized: 138083 | ||||||
|  | // test2(uint8[][]): 0x20, 2, 0x40, 0x80, 1, 7, 2, 8, 9 | ||||||
|  | // gas irOptimized: 164290 | ||||||
|  | // gas legacyOptimized: 120228 | ||||||
							
								
								
									
										44
									
								
								test/libsolidity/semanticTests/structs/copy_from_mapping.sol
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								test/libsolidity/semanticTests/structs/copy_from_mapping.sol
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,44 @@ | |||||||
|  | pragma abicoder v2; | ||||||
|  | 
 | ||||||
|  | contract C { | ||||||
|  |     struct S { | ||||||
|  |         bytes b; | ||||||
|  |         uint16[] a; | ||||||
|  |         uint16 u; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     constructor() { | ||||||
|  |         uint16[] memory a = new uint16[](2); | ||||||
|  |         a[0] = 13; | ||||||
|  |         a[1] = 14; | ||||||
|  | 
 | ||||||
|  |         m[7] = S({b: "foo", a: a, u: 7}); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     mapping (uint => S) m; | ||||||
|  |     S s; | ||||||
|  | 
 | ||||||
|  |     function to_state() public returns (S memory) { | ||||||
|  | 	s = m[7]; | ||||||
|  |         return s; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function to_storage() public returns (S memory) { | ||||||
|  |         S storage sLocal = s; | ||||||
|  | 	sLocal = m[7]; | ||||||
|  |         return sLocal; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function to_memory() public returns (S memory) { | ||||||
|  | 	return m[7]; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // ---- | ||||||
|  | // to_state() -> 0x20, 0x60, 0xa0, 7, 3, 0x666F6F0000000000000000000000000000000000000000000000000000000000, 2, 13, 14 | ||||||
|  | // gas irOptimized: 121513 | ||||||
|  | // gas legacy: 123120 | ||||||
|  | // gas legacyOptimized: 121776 | ||||||
|  | // to_storage() -> 0x20, 0x60, 0xa0, 7, 3, 0x666F6F0000000000000000000000000000000000000000000000000000000000, 2, 13, 14 | ||||||
|  | // to_memory() -> 0x20, 0x60, 0xa0, 7, 3, 0x666F6F0000000000000000000000000000000000000000000000000000000000, 2, 13, 14 | ||||||
| @ -0,0 +1,52 @@ | |||||||
|  | pragma abicoder v2; | ||||||
|  | 
 | ||||||
|  | contract C { | ||||||
|  |     struct S { | ||||||
|  |         bytes b; | ||||||
|  |         uint16[] a; | ||||||
|  |         uint16 u; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     constructor() { | ||||||
|  |         uint16[] memory a = new uint16[](2); | ||||||
|  |         a[0] = 13; | ||||||
|  |         a[1] = 14; | ||||||
|  | 
 | ||||||
|  |         m[7] = S({b: "foo", a: a, u: 7}); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     mapping (uint => S) m; | ||||||
|  |     S s; | ||||||
|  | 
 | ||||||
|  |     function to_state() public returns (S memory) { | ||||||
|  | 	s.b = m[7].b; | ||||||
|  | 	s.a = m[7].a; | ||||||
|  | 	s.u = m[7].u; | ||||||
|  |         return s; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function to_storage() public returns (S memory) { | ||||||
|  |         S storage sLocal = s; | ||||||
|  | 	sLocal.b = m[7].b; | ||||||
|  | 	sLocal.a = m[7].a; | ||||||
|  | 	sLocal.u = m[7].u; | ||||||
|  |         return sLocal; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function to_memory() public returns (S memory) { | ||||||
|  |         S memory sLocal; | ||||||
|  |         sLocal.b = m[7].b; | ||||||
|  |         sLocal.a = m[7].a; | ||||||
|  |         sLocal.u = m[7].u; | ||||||
|  | 	return sLocal; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // ---- | ||||||
|  | // to_state() -> 0x20, 0x60, 0xa0, 7, 3, 0x666F6F0000000000000000000000000000000000000000000000000000000000, 2, 13, 14 | ||||||
|  | // gas irOptimized: 121616 | ||||||
|  | // gas legacy: 123263 | ||||||
|  | // gas legacyOptimized: 121785 | ||||||
|  | // to_storage() -> 0x20, 0x60, 0xa0, 7, 3, 0x666F6F0000000000000000000000000000000000000000000000000000000000, 2, 13, 14 | ||||||
|  | // to_memory() -> 0x20, 0x60, 0xa0, 7, 3, 0x666F6F0000000000000000000000000000000000000000000000000000000000, 2, 13, 14 | ||||||
| @ -0,0 +1,66 @@ | |||||||
|  | pragma abicoder v2; | ||||||
|  | 
 | ||||||
|  | contract C { | ||||||
|  |     struct S { | ||||||
|  |         bytes b; | ||||||
|  |         uint16[] a; | ||||||
|  |         uint16 u; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     S s; | ||||||
|  |     constructor() { | ||||||
|  |         uint16[] memory a = new uint16[](2); | ||||||
|  |         a[0] = 13; | ||||||
|  |         a[1] = 14; | ||||||
|  | 
 | ||||||
|  |         s.b = "foo"; | ||||||
|  |         s.a = a; | ||||||
|  |         s.u = 21; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     mapping (uint => S) m; | ||||||
|  | 
 | ||||||
|  |     function from_memory() public returns (S memory) { | ||||||
|  |         S memory sMemory = s; | ||||||
|  |         m[0].b = sMemory.b; | ||||||
|  |         m[0].a = sMemory.a; | ||||||
|  |         m[0].u = sMemory.u; | ||||||
|  |         return m[0]; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function from_state() public returns (S memory) { | ||||||
|  |         m[1].b = s.b; | ||||||
|  |         m[1].a = s.a; | ||||||
|  |         m[1].u = s.u; | ||||||
|  |         return m[1]; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function from_storage() public returns (S memory) { | ||||||
|  |         S storage sLocal = s; | ||||||
|  |         m[1].b = sLocal.b; | ||||||
|  |         m[1].a = sLocal.a; | ||||||
|  |         m[1].u = sLocal.u; | ||||||
|  |         return m[1]; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function from_calldata(S calldata sCalldata) public returns (S memory) { | ||||||
|  |         m[2].b = sCalldata.b; | ||||||
|  |         m[2].a = sCalldata.a; | ||||||
|  |         m[2].u = sCalldata.u; | ||||||
|  |         return m[2]; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // ---- | ||||||
|  | // from_memory() -> 0x20, 0x60, 0xa0, 0x15, 3, 0x666F6F0000000000000000000000000000000000000000000000000000000000, 2, 13, 14 | ||||||
|  | // gas irOptimized: 123062 | ||||||
|  | // gas legacy: 130289 | ||||||
|  | // gas legacyOptimized: 128785 | ||||||
|  | // from_state() -> 0x20, 0x60, 0xa0, 21, 3, 0x666F6F0000000000000000000000000000000000000000000000000000000000, 2, 13, 14 | ||||||
|  | // gas irOptimized: 121776 | ||||||
|  | // gas legacy: 123341 | ||||||
|  | // gas legacyOptimized: 121892 | ||||||
|  | // from_calldata((bytes,uint16[],uint16)): 0x20, 0x60, 0xa0, 21, 3, 0x666F6F0000000000000000000000000000000000000000000000000000000000, 2, 13, 14 -> 0x20, 0x60, 0xa0, 0x15, 3, 0x666F6F0000000000000000000000000000000000000000000000000000000000, 2, 13, 14 | ||||||
|  | // gas irOptimized: 115169 | ||||||
|  | // gas legacy: 122579 | ||||||
|  | // gas legacyOptimized: 120829 | ||||||
							
								
								
									
										63
									
								
								test/libsolidity/semanticTests/structs/copy_to_mapping.sol
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										63
									
								
								test/libsolidity/semanticTests/structs/copy_to_mapping.sol
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,63 @@ | |||||||
|  | pragma abicoder v2; | ||||||
|  | 
 | ||||||
|  | contract C { | ||||||
|  |     struct S { | ||||||
|  |         bytes b; | ||||||
|  |         uint16[] a; | ||||||
|  |         uint16 u; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     S s; | ||||||
|  |     constructor() { | ||||||
|  |         uint16[] memory a = new uint16[](2); | ||||||
|  |         a[0] = 13; | ||||||
|  |         a[1] = 14; | ||||||
|  | 
 | ||||||
|  |         s.b = "foo"; | ||||||
|  |         s.a = a; | ||||||
|  |         s.u = 21; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     mapping (uint => S) m; | ||||||
|  | 
 | ||||||
|  |     function from_state() public returns (S memory) { | ||||||
|  |         m[0] = s; | ||||||
|  |         return m[0]; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function from_storage() public returns (S memory) { | ||||||
|  |         S storage sLocal = s; | ||||||
|  |         m[1] = sLocal; | ||||||
|  |         return m[1]; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function from_memory() public returns (S memory) { | ||||||
|  |         S memory sMemory = s; | ||||||
|  |         m[2] = sMemory; | ||||||
|  |         return m[2]; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     function from_calldata(S calldata sCalldata) public returns (S memory) { | ||||||
|  |         m[3] = sCalldata; | ||||||
|  |         return m[3]; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // ---- | ||||||
|  | // from_state() -> 0x20, 0x60, 0xa0, 21, 3, 0x666F6F0000000000000000000000000000000000000000000000000000000000, 2, 13, 14 | ||||||
|  | // gas irOptimized: 121709 | ||||||
|  | // gas legacy: 123198 | ||||||
|  | // gas legacyOptimized: 121830 | ||||||
|  | // from_storage() -> 0x20, 0x60, 0xa0, 21, 3, 0x666F6F0000000000000000000000000000000000000000000000000000000000, 2, 13, 14 | ||||||
|  | // gas irOptimized: 121753 | ||||||
|  | // gas legacy: 123247 | ||||||
|  | // gas legacyOptimized: 121882 | ||||||
|  | // from_memory() -> 0x20, 0x60, 0xa0, 21, 3, 0x666F6F0000000000000000000000000000000000000000000000000000000000, 2, 13, 14 | ||||||
|  | // gas irOptimized: 122954 | ||||||
|  | // gas legacy: 130146 | ||||||
|  | // gas legacyOptimized: 128779 | ||||||
|  | // from_calldata((bytes,uint16[],uint16)): 0x20, 0x60, 0xa0, 21, 3, 0x666F6F0000000000000000000000000000000000000000000000000000000000, 2, 13, 14 -> 0x20, 0x60, 0xa0, 21, 3, 0x666f6f0000000000000000000000000000000000000000000000000000000000, 2, 13, 14 | ||||||
|  | // gas irOptimized: 115067 | ||||||
|  | // gas legacy: 118383 | ||||||
|  | // gas legacyOptimized: 115458 | ||||||
| @ -0,0 +1,35 @@ | |||||||
|  | pragma abicoder v2; | ||||||
|  | 
 | ||||||
|  | contract C { | ||||||
|  |     struct S { | ||||||
|  |         uint8[3] x; | ||||||
|  |         uint8[][] y; | ||||||
|  |         uint16 z; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     mapping (uint8 => S) src; | ||||||
|  |     mapping (uint8 => S) dst; | ||||||
|  | 
 | ||||||
|  |     constructor() { | ||||||
|  |         uint8[] memory d = new uint8[](2); | ||||||
|  |         d[0] = 3; | ||||||
|  |         d[1] = 4; | ||||||
|  | 
 | ||||||
|  |         uint8[][] memory y = new uint8[][](2); | ||||||
|  |         y[0] = d; | ||||||
|  |         y[1] = d; | ||||||
|  | 
 | ||||||
|  |         src[0] = S({x: [7, 8, 9], y: y, z: 13}); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function f() public returns (S memory) { | ||||||
|  |         dst[0] = src[0]; | ||||||
|  |         return dst[0]; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // ---- | ||||||
|  | // f() -> 0x20, 7, 8, 9, 0xa0, 13, 2, 0x40, 0xa0, 2, 3, 4, 2, 3, 4 | ||||||
|  | // gas irOptimized: 197113 | ||||||
|  | // gas legacy: 199986 | ||||||
|  | // gas legacyOptimized: 196847 | ||||||
| @ -0,0 +1,57 @@ | |||||||
|  | pragma abicoder v2; | ||||||
|  | 
 | ||||||
|  | contract C { | ||||||
|  |     struct S { | ||||||
|  |         uint8 x; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     constructor() { | ||||||
|  |         s = S({x: 7}); | ||||||
|  |         m2[0].push(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     S s; | ||||||
|  | 
 | ||||||
|  |     mapping (uint8 => S[2]) m1; | ||||||
|  |     mapping (uint8 => S[]) m2; | ||||||
|  | 
 | ||||||
|  |     function from_storage_to_static_array() public returns (S[2] memory) { | ||||||
|  |         m1[0][1] = s; | ||||||
|  |         return m1[0]; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function from_storage_to_dynamic_array() public returns (S[] memory) { | ||||||
|  |         m2[0][0] = s; | ||||||
|  |         return m2[0]; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function from_memory_to_static_array() public returns (S[2] memory) { | ||||||
|  |         S memory sLocal = s; | ||||||
|  |         m1[0][1] = sLocal; | ||||||
|  |         return m1[0]; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function from_memory_to_dynamic_array() public returns (S[] memory) { | ||||||
|  |         S memory sLocal = s; | ||||||
|  |         m2[0][0] = sLocal; | ||||||
|  |         return m2[0]; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function from_calldata_to_static_array(S calldata sCalldata) public returns (S[2] memory) { | ||||||
|  |         m1[0][1] = sCalldata; | ||||||
|  |         return m1[0]; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function from_calldata_to_dynamic_array(S calldata sCalldata) public returns (S[] memory) { | ||||||
|  |         m2[0][0] = sCalldata; | ||||||
|  |         return m2[0]; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // ---- | ||||||
|  | // from_storage_to_static_array() -> 0, 7 | ||||||
|  | // from_storage_to_dynamic_array() -> 0x20, 1, 7 | ||||||
|  | // from_memory_to_static_array() -> 0, 7 | ||||||
|  | // from_memory_to_dynamic_array() -> 0x20, 1, 7 | ||||||
|  | // from_calldata_to_static_array((uint8)): 8 -> 0, 8 | ||||||
|  | // from_calldata_to_dynamic_array((uint8)): 8 -> 0x20, 1, 8 | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user