mirror of
				https://github.com/ethereum/solidity
				synced 2023-10-03 13:03:40 +00:00 
			
		
		
		
	Merge pull request #2084 from chriseth/sol_computeConstants
Compute constants
This commit is contained in:
		
						commit
						4141a0de5e
					
				| @ -1036,6 +1036,51 @@ BOOST_AUTO_TEST_CASE(block_deduplicator_loops) | ||||
| 	BOOST_CHECK_EQUAL(pushTags.size(), 1); | ||||
| } | ||||
| 
 | ||||
| BOOST_AUTO_TEST_CASE(computing_constants) | ||||
| { | ||||
| 	char const* sourceCode = R"( | ||||
| 		contract c { | ||||
| 			uint a; | ||||
| 			uint b; | ||||
| 			uint c; | ||||
| 			function set() returns (uint a, uint b, uint c) { | ||||
| 				a = 0x77abc0000000000000000000000000000000000000000000000000000000001; | ||||
| 				b = 0x817416927846239487123469187231298734162934871263941234127518276; | ||||
| 				g(); | ||||
| 			} | ||||
| 			function g() { | ||||
| 				b = 0x817416927846239487123469187231298734162934871263941234127518276; | ||||
| 				c = 0x817416927846239487123469187231298734162934871263941234127518276; | ||||
| 			} | ||||
| 			function get() returns (uint ra, uint rb, uint rc) { | ||||
| 				ra = a; | ||||
| 				rb = b; | ||||
| 				rc = c ; | ||||
| 			} | ||||
| 		} | ||||
| 	)"; | ||||
| 	compileBothVersions(sourceCode); | ||||
| 	compareVersions("set()"); | ||||
| 	compareVersions("get()"); | ||||
| 
 | ||||
| 	m_optimize = true; | ||||
| 	m_optimizeRuns = 1; | ||||
| 	bytes optimizedBytecode = compileAndRun(sourceCode, 0, "c"); | ||||
| 	bytes complicatedConstant = toBigEndian(u256("0x817416927846239487123469187231298734162934871263941234127518276")); | ||||
| 	unsigned occurrences = 0; | ||||
| 	for (auto iter = optimizedBytecode.cbegin(); iter < optimizedBytecode.cend(); ++occurrences) | ||||
| 		iter = search(iter, optimizedBytecode.cend(), complicatedConstant.cbegin(), complicatedConstant.cend()) + 1; | ||||
| 	BOOST_CHECK_EQUAL(2, occurrences); | ||||
| 
 | ||||
| 	bytes constantWithZeros = toBigEndian(u256("0x77abc0000000000000000000000000000000000000000000000000000000001")); | ||||
| 	BOOST_CHECK(search( | ||||
| 		optimizedBytecode.cbegin(), | ||||
| 		optimizedBytecode.cend(), | ||||
| 		constantWithZeros.cbegin(), | ||||
| 		constantWithZeros.cend() | ||||
| 	) == optimizedBytecode.cend()); | ||||
| } | ||||
| 
 | ||||
| BOOST_AUTO_TEST_SUITE_END() | ||||
| 
 | ||||
| } | ||||
|  | ||||
| @ -46,7 +46,7 @@ public: | ||||
| 	{ | ||||
| 		m_compiler.reset(false, m_addStandardSources); | ||||
| 		m_compiler.addSource("", _sourceCode); | ||||
| 		ETH_TEST_REQUIRE_NO_THROW(m_compiler.compile(m_optimize), "Compiling contract failed"); | ||||
| 		ETH_TEST_REQUIRE_NO_THROW(m_compiler.compile(m_optimize, m_optimizeRuns), "Compiling contract failed"); | ||||
| 		bytes code = m_compiler.getBytecode(_contractName); | ||||
| 		sendMessage(code, true, _value); | ||||
| 		return m_output; | ||||
| @ -180,6 +180,7 @@ protected: | ||||
| 		m_logs = executive.logs(); | ||||
| 	} | ||||
| 
 | ||||
| 	size_t m_optimizeRuns = 200; | ||||
| 	bool m_optimize = false; | ||||
| 	bool m_addStandardSources = false; | ||||
| 	dev::solidity::CompilerStack m_compiler; | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user