diff options
author | chriseth <c@ethdev.com> | 2015-06-06 21:31:22 +0800 |
---|---|---|
committer | chriseth <c@ethdev.com> | 2015-06-06 21:39:14 +0800 |
commit | 55e1729852716ccffeada013453e3c40f0edaf28 (patch) | |
tree | c6dffb1c5641907876faaf2a9991918cfeeef4f0 /CommonSubexpressionEliminator.cpp | |
parent | cad767de61dc53b9b297f08ee09cb5a3c0821782 (diff) | |
download | dexon-solidity-55e1729852716ccffeada013453e3c40f0edaf28.tar.gz dexon-solidity-55e1729852716ccffeada013453e3c40f0edaf28.tar.zst dexon-solidity-55e1729852716ccffeada013453e3c40f0edaf28.zip |
Quick fix to not access inaccessible sequences.
Diffstat (limited to 'CommonSubexpressionEliminator.cpp')
-rw-r--r-- | CommonSubexpressionEliminator.cpp | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/CommonSubexpressionEliminator.cpp b/CommonSubexpressionEliminator.cpp index b2fa7311..fe86908f 100644 --- a/CommonSubexpressionEliminator.cpp +++ b/CommonSubexpressionEliminator.cpp @@ -46,6 +46,7 @@ vector<AssemblyItem> CommonSubexpressionEliminator::getOptimizedItems() targetStackContents[height] = m_state.stackElement(height, SourceLocation()); AssemblyItems items = CSECodeGenerator(m_state.expressionClasses(), m_storeOperations).generateCode( + m_initialState.sequenceNumber(), m_initialState.stackHeight(), initialStackContents, targetStackContents @@ -112,6 +113,7 @@ CSECodeGenerator::CSECodeGenerator( } AssemblyItems CSECodeGenerator::generateCode( + unsigned _initialSequenceNumber, int _initialStackHeight, map<int, Id> const& _initialStack, map<int, Id> const& _targetStackContents @@ -137,7 +139,14 @@ AssemblyItems CSECodeGenerator::generateCode( for (auto const& p: m_neededBy) for (auto id: {p.first, p.second}) if (unsigned seqNr = m_expressionClasses.representative(id).sequenceNumber) + { + if (seqNr < _initialSequenceNumber) + // Invalid sequenced operation. + // @todo quick fix for now. Proper fix needs to choose representative with higher + // sequence number during dependency analyis. + BOOST_THROW_EXCEPTION(StackTooDeepException()); sequencedExpressions.insert(make_pair(seqNr, id)); + } // Perform all operations on storage and memory in order, if they are needed. for (auto const& seqAndId: sequencedExpressions) |