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_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()
|
BOOST_AUTO_TEST_SUITE_END()
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -46,7 +46,7 @@ public:
|
|||||||
{
|
{
|
||||||
m_compiler.reset(false, m_addStandardSources);
|
m_compiler.reset(false, m_addStandardSources);
|
||||||
m_compiler.addSource("", _sourceCode);
|
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);
|
bytes code = m_compiler.getBytecode(_contractName);
|
||||||
sendMessage(code, true, _value);
|
sendMessage(code, true, _value);
|
||||||
return m_output;
|
return m_output;
|
||||||
@ -180,6 +180,7 @@ protected:
|
|||||||
m_logs = executive.logs();
|
m_logs = executive.logs();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
size_t m_optimizeRuns = 200;
|
||||||
bool m_optimize = false;
|
bool m_optimize = false;
|
||||||
bool m_addStandardSources = false;
|
bool m_addStandardSources = false;
|
||||||
dev::solidity::CompilerStack m_compiler;
|
dev::solidity::CompilerStack m_compiler;
|
||||||
|
Loading…
Reference in New Issue
Block a user