mirror of
				https://github.com/ethereum/solidity
				synced 2023-10-03 13:03:40 +00:00 
			
		
		
		
	Memory structs.
This commit is contained in:
		
							parent
							
								
									6308d8d0f7
								
							
						
					
					
						commit
						fc8f83b84e
					
				| @ -4806,6 +4806,149 @@ BOOST_AUTO_TEST_CASE(memory_arrays_dynamic_index_access_write) | ||||
| 	BOOST_CHECK(callContractFunction("f()") == encodeArgs(u256(0x20), u256(4), data)); | ||||
| } | ||||
| 
 | ||||
| BOOST_AUTO_TEST_CASE(memory_structs_read_write) | ||||
| { | ||||
| 	char const* sourceCode = R"( | ||||
| 		contract Test { | ||||
| 			struct S { uint8 x; uint16 y; uint z; uint8[2] a; } | ||||
| 			S[5] data; | ||||
| 			function testInit() returns (uint8 x, uint16 y, uint z, uint8 a, bool flag) { | ||||
| 				S[2] memory d; | ||||
| 				x = d[0].x; | ||||
| 				y = d[0].y; | ||||
| 				z = d[0].z; | ||||
| 				a = d[0].a[1]; | ||||
| 				flag = true; | ||||
| 			} | ||||
| 			function testCopyRead() returns (uint8 x, uint16 y, uint z, uint8 a) { | ||||
| 				data[2].x = 1; | ||||
| 				data[2].y = 2; | ||||
| 				data[2].z = 3; | ||||
| 				data[2].a[1] = 4; | ||||
| 				S memory s = data[2]; | ||||
| 				x = s.x; | ||||
| 				y = s.y; | ||||
| 				z = s.z; | ||||
| 				a = s.a[1]; | ||||
| 			} | ||||
| 			function testAssign() returns (uint8 x, uint16 y, uint z, uint8 a) { | ||||
| 				S memory s; | ||||
| 				s.x = 1; | ||||
| 				s.y = 2; | ||||
| 				s.z = 3; | ||||
| 				s.a[1] = 4; | ||||
| 				x = s.x; | ||||
| 				y = s.y; | ||||
| 				z = s.z; | ||||
| 				a = s.a[1]; | ||||
| 			} | ||||
| 		} | ||||
| 	)"; | ||||
| 	compileAndRun(sourceCode, 0, "Test"); | ||||
| 
 | ||||
| 	BOOST_CHECK(callContractFunction("testInit()") == encodeArgs(u256(0), u256(0), u256(0), u256(0), true)); | ||||
| 	BOOST_CHECK(callContractFunction("testCopyRead()") == encodeArgs(u256(1), u256(2), u256(3), u256(4))); | ||||
| 	BOOST_CHECK(callContractFunction("testAssign()") == encodeArgs(u256(1), u256(2), u256(3), u256(4))); | ||||
| } | ||||
| 
 | ||||
| BOOST_AUTO_TEST_CASE(memory_structs_as_function_args) | ||||
| { | ||||
| 	char const* sourceCode = R"( | ||||
| 		contract Test { | ||||
| 			struct S { uint8 x; uint16 y; uint z; } | ||||
| 			function test() returns (uint x, uint y, uint z) { | ||||
| 				S memory data = combine(1, 2, 3); | ||||
| 				x = extract(data, 0); | ||||
| 				y = extract(data, 1); | ||||
| 				z = extract(data, 2); | ||||
| 			} | ||||
| 			function extract(S s, uint which) internal returns (uint x) { | ||||
| 				if (which == 0) return s.x; | ||||
| 				else if (which == 1) return s.y; | ||||
| 				else return s.z; | ||||
| 			} | ||||
| 			function combine(uint8 x, uint16 y, uint z) internal returns (S s) { | ||||
| 				s.x = x; | ||||
| 				s.y = y; | ||||
| 				s.z = z; | ||||
| 			} | ||||
| 		} | ||||
| 	)"; | ||||
| 	compileAndRun(sourceCode, 0, "Test"); | ||||
| 
 | ||||
| 	BOOST_CHECK(callContractFunction("test()") == encodeArgs(u256(1), u256(2), u256(3))); | ||||
| } | ||||
| 
 | ||||
| BOOST_AUTO_TEST_CASE(memory_structs_wrapped) | ||||
| { | ||||
| 	char const* sourceCode = R"( | ||||
| 		contract Test { | ||||
| 			struct S { uint8 x; uint16 y; uint z; } | ||||
| 			struct X { uint8 x; S s; } | ||||
| 			function test() returns (uint a, uint x, uint y, uint z) { | ||||
| 				X memory d = combine(1, 2, 3, 4); | ||||
| 				a = extract(d, 0); | ||||
| 				x = extract(d, 1); | ||||
| 				y = extract(d, 2); | ||||
| 				z = extract(d, 3); | ||||
| 			} | ||||
| 			function extract(X s, uint which) internal returns (uint x) { | ||||
| 				if (which == 0) return s.x; | ||||
| 				else if (which == 1) return s.s.x; | ||||
| 				else if (which == 2) return s.s.y; | ||||
| 				else return s.s.z; | ||||
| 			} | ||||
| 			function combine(uint8 a, uint8 x, uint16 y, uint z) internal returns (X s) { | ||||
| 				s.x = a; | ||||
| 				s.s.x = x; | ||||
| 				s.s.y = y; | ||||
| 				s.s.z = z; | ||||
| 			} | ||||
| 		} | ||||
| 	)"; | ||||
| 	compileAndRun(sourceCode, 0, "Test"); | ||||
| 
 | ||||
| 	BOOST_CHECK(callContractFunction("test()") == encodeArgs(u256(1), u256(2), u256(3), u256(4))); | ||||
| } | ||||
| 
 | ||||
| BOOST_AUTO_TEST_CASE(memory_structs_wrapped_load) | ||||
| { | ||||
| 	char const* sourceCode = R"( | ||||
| 		contract Test { | ||||
| 			struct S { uint8 x; uint16 y; uint z; } | ||||
| 			struct X { uint8 x; S s; } | ||||
| 			X m_x; | ||||
| 			function load() returns (uint a, uint x, uint y, uint z) { | ||||
| 				m_x.x = 1; | ||||
| 				m_x.s.x = 2; | ||||
| 				m_x.s.y = 3; | ||||
| 				m_x.s.z = 4; | ||||
| 				X memory d = m_x; | ||||
| 				a = d.x; | ||||
| 				x = d.s.x; | ||||
| 				y = d.s.y; | ||||
| 				z = d.s.z; | ||||
| 			} | ||||
| 			function store() returns (uint a, uint x, uint y, uint z) { | ||||
| 				X memory d = m_x; | ||||
| 				d.x = 1; | ||||
| 				d.s.x = 2; | ||||
| 				d.s.y = 3; | ||||
| 				d.s.z = 4; | ||||
| 				m_x = d; | ||||
| 				a = m_x.x; | ||||
| 				x = m_x.s.x; | ||||
| 				y = m_x.s.y; | ||||
| 				z = m_x.s.z; | ||||
| 			} | ||||
| 		} | ||||
| 	)"; | ||||
| 	compileAndRun(sourceCode, 0, "Test"); | ||||
| 
 | ||||
| 	BOOST_CHECK(callContractFunction("load()") == encodeArgs(u256(1), u256(2), u256(3), u256(4))); | ||||
| 	BOOST_CHECK(callContractFunction("store()") == encodeArgs(u256(1), u256(2), u256(3), u256(4))); | ||||
| } | ||||
| 
 | ||||
| BOOST_AUTO_TEST_SUITE_END() | ||||
| 
 | ||||
| } | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user