Merge pull request #1418 from ethereum/develop

Release 0.4.6
This commit is contained in:
chriseth 2016-11-22 15:34:17 +01:00 committed by GitHub
commit 2dabbdf06f
5 changed files with 53 additions and 39 deletions

View File

@ -8,7 +8,7 @@ include(EthPolicy)
eth_policy() eth_policy()
# project name and version should be set after cmake_policy CMP0048 # project name and version should be set after cmake_policy CMP0048
set(PROJECT_VERSION "0.4.5") set(PROJECT_VERSION "0.4.6")
project(solidity VERSION ${PROJECT_VERSION}) project(solidity VERSION ${PROJECT_VERSION})
# Let's find our dependencies # Let's find our dependencies

View File

@ -1,3 +1,8 @@
### 0.4.6 (2016-11-22)
Bugfixes:
* Optimizer: Knowledge about state was not correctly cleared for JUMPDESTs
### 0.4.5 (2016-11-21) ### 0.4.5 (2016-11-21)
Features: Features:

View File

@ -56,9 +56,9 @@ copyright = '2016, Ethereum'
# built documents. # built documents.
# #
# The short X.Y version. # The short X.Y version.
version = '0.4.5' version = '0.4.6'
# The full version, including alpha/beta/rc tags. # The full version, including alpha/beta/rc tags.
release = '0.4.5-develop' release = '0.4.6-develop'
# The language for content autogenerated by Sphinx. Refer to documentation # The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages. # for a list of supported languages.

View File

@ -360,25 +360,16 @@ map<u256, u256> Assembly::optimiseInternal(bool _enable, bool _isCreation, size_
auto iter = m_items.begin(); auto iter = m_items.begin();
while (iter != m_items.end()) while (iter != m_items.end())
{ {
auto end = iter;
while (end != m_items.end())
if (SemanticInformation::altersControlFlow(*end++))
break;
KnownState emptyState; KnownState emptyState;
CommonSubexpressionEliminator eliminator(emptyState); CommonSubexpressionEliminator eliminator(emptyState);
auto blockIter = iter; auto orig = iter;
auto const blockEnd = end; iter = eliminator.feedItems(iter, m_items.end());
while (blockIter < blockEnd)
{
auto orig = blockIter;
blockIter = eliminator.feedItems(blockIter, blockEnd);
bool shouldReplace = false; bool shouldReplace = false;
AssemblyItems optimisedChunk; AssemblyItems optimisedChunk;
try try
{ {
optimisedChunk = eliminator.getOptimizedItems(); optimisedChunk = eliminator.getOptimizedItems();
shouldReplace = (optimisedChunk.size() < size_t(blockIter - orig)); shouldReplace = (optimisedChunk.size() < size_t(iter - orig));
} }
catch (StackTooDeepException const&) catch (StackTooDeepException const&)
{ {
@ -397,9 +388,7 @@ map<u256, u256> Assembly::optimiseInternal(bool _enable, bool _isCreation, size_
optimisedItems += optimisedChunk; optimisedItems += optimisedChunk;
} }
else else
copy(orig, blockIter, back_inserter(optimisedItems)); copy(orig, iter, back_inserter(optimisedItems));
}
iter = end;
} }
if (optimisedItems.size() < m_items.size()) if (optimisedItems.size() < m_items.size())
{ {

View File

@ -1246,6 +1246,26 @@ BOOST_AUTO_TEST_CASE(dead_code_elimination_across_assemblies)
compareVersions("test()"); compareVersions("test()");
} }
BOOST_AUTO_TEST_CASE(invalid_state_at_control_flow_join)
{
char const* sourceCode = R"(
contract Test {
uint256 public totalSupply = 100;
function f() returns (uint r) {
if (false)
r = totalSupply;
totalSupply -= 10;
}
function test() returns (uint) {
f();
return this.totalSupply();
}
}
)";
compileBothVersions(sourceCode);
compareVersions("test()");
}
BOOST_AUTO_TEST_SUITE_END() BOOST_AUTO_TEST_SUITE_END()
} }