mirror of
				https://github.com/ethereum/solidity
				synced 2023-10-03 13:03:40 +00:00 
			
		
		
		
	Merge branch 'develop' into build_enhancement
This commit is contained in:
		
						commit
						82dbdce5ee
					
				| @ -374,6 +374,7 @@ void executeTests(const string& _name, const string& _testPathAppendix, std::fun | |||||||
| 			{ | 			{ | ||||||
| 				BOOST_ERROR("Failed test with Exception: " << _e.what()); | 				BOOST_ERROR("Failed test with Exception: " << _e.what()); | ||||||
| 			} | 			} | ||||||
|  | 			break; | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | |||||||
							
								
								
									
										35
									
								
								recursiveCreateFiller.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								recursiveCreateFiller.json
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,35 @@ | |||||||
|  | { | ||||||
|  |   "recursiveCreate": { | ||||||
|  |     "env": { | ||||||
|  |       "previousHash": "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", | ||||||
|  |       "currentNumber": "0", | ||||||
|  |       "currentGasLimit": "10000000", | ||||||
|  |       "currentDifficulty": "256", | ||||||
|  |       "currentTimestamp": 1, | ||||||
|  |       "currentCoinbase": "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" | ||||||
|  |     }, | ||||||
|  |     "pre": { | ||||||
|  |       "095e7baea6a6c7c4c2dfeb977efac326af552d87": { | ||||||
|  |         "balance": "20000000", | ||||||
|  |         "nonce": 0, | ||||||
|  |         "code": "{(CODECOPY 0 0 32)(CREATE 0 0 32)}", | ||||||
|  |         "storage": {} | ||||||
|  |       }, | ||||||
|  |       "a94f5374fce5edbc8e2a8697c15331677e6ebf0b": { | ||||||
|  |         "balance": "1000000000000000000", | ||||||
|  |         "nonce": 0, | ||||||
|  |         "code": "", | ||||||
|  |         "storage": {} | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     "transaction": { | ||||||
|  |       "nonce": "0", | ||||||
|  |       "gasPrice": "1", | ||||||
|  |       "gasLimit": "465224", | ||||||
|  |       "to": "095e7baea6a6c7c4c2dfeb977efac326af552d87", | ||||||
|  |       "value": "100000", | ||||||
|  |       "secretKey": "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", | ||||||
|  |       "data": "" | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | } | ||||||
| @ -700,6 +700,28 @@ BOOST_AUTO_TEST_CASE(structs) | |||||||
| 	BOOST_CHECK(callContractFunction(0) == bytes({0x01})); | 	BOOST_CHECK(callContractFunction(0) == bytes({0x01})); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | BOOST_AUTO_TEST_CASE(constructor) | ||||||
|  | { | ||||||
|  | 	char const* sourceCode = "contract test {\n" | ||||||
|  | 							 "  mapping(uint => uint) data;\n" | ||||||
|  | 							 "  function test() {\n" | ||||||
|  | 							 "    data[7] = 8;\n" | ||||||
|  | 							 "  }\n" | ||||||
|  | 							 "  function get(uint key) returns (uint value) {\n" | ||||||
|  | 							 "    return data[key];" | ||||||
|  | 							 "  }\n" | ||||||
|  | 							 "}\n"; | ||||||
|  | 	compileAndRun(sourceCode); | ||||||
|  | 	map<u256, byte> data; | ||||||
|  | 	data[7] = 8; | ||||||
|  | 	auto get = [&](u256 const& _x) -> u256 | ||||||
|  | 	{ | ||||||
|  | 		return data[_x]; | ||||||
|  | 	}; | ||||||
|  | 	testSolidityAgainstCpp(0, get, u256(6)); | ||||||
|  | 	testSolidityAgainstCpp(0, get, u256(7)); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| BOOST_AUTO_TEST_SUITE_END() | BOOST_AUTO_TEST_SUITE_END() | ||||||
| 
 | 
 | ||||||
| } | } | ||||||
|  | |||||||
| @ -153,6 +153,46 @@ BOOST_AUTO_TEST_CASE(ambiguities) | |||||||
| 	BOOST_CHECK_EQUAL(scanner.next(), Token::SHL); | 	BOOST_CHECK_EQUAL(scanner.next(), Token::SHL); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | BOOST_AUTO_TEST_CASE(documentation_comments_parsed_begin) | ||||||
|  | { | ||||||
|  | 	Scanner scanner(CharStream("/// Send $(value / 1000) chocolates to the user")); | ||||||
|  | 	BOOST_CHECK_EQUAL(scanner.getCurrentToken(), Token::EOS); | ||||||
|  | 	BOOST_CHECK_EQUAL(scanner.getCurrentCommentLiteral(), " Send $(value / 1000) chocolates to the user"); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | BOOST_AUTO_TEST_CASE(documentation_comments_parsed) | ||||||
|  | { | ||||||
|  | 	Scanner scanner(CharStream("some other tokens /// Send $(value / 1000) chocolates to the user")); | ||||||
|  | 	BOOST_CHECK_EQUAL(scanner.getCurrentToken(), Token::IDENTIFIER); | ||||||
|  | 	BOOST_CHECK_EQUAL(scanner.next(), Token::IDENTIFIER); | ||||||
|  | 	BOOST_CHECK_EQUAL(scanner.next(), Token::IDENTIFIER); | ||||||
|  | 	BOOST_CHECK_EQUAL(scanner.next(), Token::EOS); | ||||||
|  | 	BOOST_CHECK_EQUAL(scanner.getCurrentCommentLiteral(), " Send $(value / 1000) chocolates to the user"); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | BOOST_AUTO_TEST_CASE(comment_before_eos) | ||||||
|  | { | ||||||
|  | 	Scanner scanner(CharStream("//")); | ||||||
|  | 	BOOST_CHECK_EQUAL(scanner.getCurrentToken(), Token::EOS); | ||||||
|  | 	BOOST_CHECK_EQUAL(scanner.getCurrentCommentLiteral(), ""); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | BOOST_AUTO_TEST_CASE(documentation_comment_before_eos) | ||||||
|  | { | ||||||
|  | 	Scanner scanner(CharStream("///")); | ||||||
|  | 	BOOST_CHECK_EQUAL(scanner.getCurrentToken(), Token::EOS); | ||||||
|  | 	BOOST_CHECK_EQUAL(scanner.getCurrentCommentLiteral(), ""); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | BOOST_AUTO_TEST_CASE(comments_mixed_in_sequence) | ||||||
|  | { | ||||||
|  | 	Scanner scanner(CharStream("hello_world ///documentation comment \n" | ||||||
|  | 							   "//simple comment \n" | ||||||
|  | 							   "<<")); | ||||||
|  | 	BOOST_CHECK_EQUAL(scanner.getCurrentToken(), Token::IDENTIFIER); | ||||||
|  | 	BOOST_CHECK_EQUAL(scanner.next(), Token::SHL); | ||||||
|  | 	BOOST_CHECK_EQUAL(scanner.getCurrentCommentLiteral(), "documentation comment "); | ||||||
|  | } | ||||||
| 
 | 
 | ||||||
| BOOST_AUTO_TEST_SUITE_END() | BOOST_AUTO_TEST_SUITE_END() | ||||||
| 
 | 
 | ||||||
|  | |||||||
							
								
								
									
										81
									
								
								vm.cpp
									
									
									
									
									
								
							
							
						
						
									
										81
									
								
								vm.cpp
									
									
									
									
									
								
							| @ -300,6 +300,7 @@ void doVMTests(json_spirit::mValue& v, bool _fillin) | |||||||
| 		VM vm(fev.gas); | 		VM vm(fev.gas); | ||||||
| 
 | 
 | ||||||
| 		u256 gas; | 		u256 gas; | ||||||
|  | 		bool vmExceptionOccured = false; | ||||||
| 		try | 		try | ||||||
| 		{ | 		{ | ||||||
| 			output = vm.go(fev, fev.simpleTrace()).toVector(); | 			output = vm.go(fev, fev.simpleTrace()).toVector(); | ||||||
| @ -308,7 +309,7 @@ void doVMTests(json_spirit::mValue& v, bool _fillin) | |||||||
| 		catch (VMException const& _e) | 		catch (VMException const& _e) | ||||||
| 		{ | 		{ | ||||||
| 			cnote << "VM did throw an exception: " << diagnostic_information(_e); | 			cnote << "VM did throw an exception: " << diagnostic_information(_e); | ||||||
| 			gas = 0; | 			vmExceptionOccured = true; | ||||||
| 		} | 		} | ||||||
| 		catch (Exception const& _e) | 		catch (Exception const& _e) | ||||||
| 		{ | 		{ | ||||||
| @ -342,48 +343,58 @@ void doVMTests(json_spirit::mValue& v, bool _fillin) | |||||||
| 		{ | 		{ | ||||||
| 			o["env"] = mValue(fev.exportEnv()); | 			o["env"] = mValue(fev.exportEnv()); | ||||||
| 			o["exec"] = mValue(fev.exportExec()); | 			o["exec"] = mValue(fev.exportExec()); | ||||||
| 			o["post"] = mValue(fev.exportState()); | 			if (!vmExceptionOccured) | ||||||
| 			o["callcreates"] = fev.exportCallCreates(); | 			{ | ||||||
| 			o["out"] = "0x" + toHex(output); | 				o["post"] = mValue(fev.exportState()); | ||||||
| 			fev.push(o, "gas", gas); | 				o["callcreates"] = fev.exportCallCreates(); | ||||||
|  | 				o["out"] = "0x" + toHex(output); | ||||||
|  | 				fev.push(o, "gas", gas); | ||||||
|  | 			} | ||||||
| 		} | 		} | ||||||
| 		else | 		else | ||||||
| 		{ | 		{ | ||||||
| 			BOOST_REQUIRE(o.count("post") > 0); | 			if (o.count("post") > 0)	// No exceptions expected
 | ||||||
| 			BOOST_REQUIRE(o.count("callcreates") > 0); |  | ||||||
| 			BOOST_REQUIRE(o.count("out") > 0); |  | ||||||
| 			BOOST_REQUIRE(o.count("gas") > 0); |  | ||||||
| 
 |  | ||||||
| 			dev::test::FakeExtVM test; |  | ||||||
| 			test.importState(o["post"].get_obj()); |  | ||||||
| 			test.importCallCreates(o["callcreates"].get_array()); |  | ||||||
| 
 |  | ||||||
| 			checkOutput(output, o); |  | ||||||
| 
 |  | ||||||
| 			BOOST_CHECK_EQUAL(toInt(o["gas"]), gas); |  | ||||||
| 
 |  | ||||||
| 			auto& expectedAddrs = test.addresses; |  | ||||||
| 			auto& resultAddrs = fev.addresses; |  | ||||||
| 			for (auto&& expectedPair : expectedAddrs) |  | ||||||
| 			{ | 			{ | ||||||
| 				auto& expectedAddr = expectedPair.first; | 				BOOST_CHECK(!vmExceptionOccured); | ||||||
| 				auto resultAddrIt = resultAddrs.find(expectedAddr); | 
 | ||||||
| 				if (resultAddrIt == resultAddrs.end()) | 				BOOST_REQUIRE(o.count("post") > 0); | ||||||
| 					BOOST_ERROR("Missing expected address " << expectedAddr); | 				BOOST_REQUIRE(o.count("callcreates") > 0); | ||||||
| 				else | 				BOOST_REQUIRE(o.count("out") > 0); | ||||||
|  | 				BOOST_REQUIRE(o.count("gas") > 0); | ||||||
|  | 
 | ||||||
|  | 				dev::test::FakeExtVM test; | ||||||
|  | 				test.importState(o["post"].get_obj()); | ||||||
|  | 				test.importCallCreates(o["callcreates"].get_array()); | ||||||
|  | 
 | ||||||
|  | 				checkOutput(output, o); | ||||||
|  | 
 | ||||||
|  | 				BOOST_CHECK_EQUAL(toInt(o["gas"]), gas); | ||||||
|  | 
 | ||||||
|  | 				auto& expectedAddrs = test.addresses; | ||||||
|  | 				auto& resultAddrs = fev.addresses; | ||||||
|  | 				for (auto&& expectedPair : expectedAddrs) | ||||||
| 				{ | 				{ | ||||||
| 					auto& expectedState = expectedPair.second; | 					auto& expectedAddr = expectedPair.first; | ||||||
| 					auto& resultState = resultAddrIt->second; | 					auto resultAddrIt = resultAddrs.find(expectedAddr); | ||||||
| 					BOOST_CHECK_MESSAGE(std::get<0>(expectedState) == std::get<0>(resultState), expectedAddr << ": incorrect balance " << std::get<0>(resultState) << ", expected " << std::get<0>(expectedState)); | 					if (resultAddrIt == resultAddrs.end()) | ||||||
| 					BOOST_CHECK_MESSAGE(std::get<1>(expectedState) == std::get<1>(resultState), expectedAddr << ": incorrect txCount " << std::get<1>(resultState) << ", expected " << std::get<1>(expectedState)); | 						BOOST_ERROR("Missing expected address " << expectedAddr); | ||||||
| 					BOOST_CHECK_MESSAGE(std::get<3>(expectedState) == std::get<3>(resultState), expectedAddr << ": incorrect code"); | 					else | ||||||
|  | 					{ | ||||||
|  | 						auto& expectedState = expectedPair.second; | ||||||
|  | 						auto& resultState = resultAddrIt->second; | ||||||
|  | 						BOOST_CHECK_MESSAGE(std::get<0>(expectedState) == std::get<0>(resultState), expectedAddr << ": incorrect balance " << std::get<0>(resultState) << ", expected " << std::get<0>(expectedState)); | ||||||
|  | 						BOOST_CHECK_MESSAGE(std::get<1>(expectedState) == std::get<1>(resultState), expectedAddr << ": incorrect txCount " << std::get<1>(resultState) << ", expected " << std::get<1>(expectedState)); | ||||||
|  | 						BOOST_CHECK_MESSAGE(std::get<3>(expectedState) == std::get<3>(resultState), expectedAddr << ": incorrect code"); | ||||||
| 
 | 
 | ||||||
| 					checkStorage(std::get<2>(expectedState), std::get<2>(resultState), expectedAddr); | 						checkStorage(std::get<2>(expectedState), std::get<2>(resultState), expectedAddr); | ||||||
|  | 					} | ||||||
| 				} | 				} | ||||||
| 			} |  | ||||||
| 
 | 
 | ||||||
| 			checkAddresses<std::map<Address, std::tuple<u256, u256, std::map<u256, u256>, bytes> > >(test.addresses, fev.addresses); | 				checkAddresses<std::map<Address, std::tuple<u256, u256, std::map<u256, u256>, bytes> > >(test.addresses, fev.addresses); | ||||||
| 			BOOST_CHECK(test.callcreates == fev.callcreates); | 				BOOST_CHECK(test.callcreates == fev.callcreates); | ||||||
|  | 			} | ||||||
|  | 			else	// Exception expected
 | ||||||
|  | 				BOOST_CHECK(vmExceptionOccured); | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user