aboutsummaryrefslogtreecommitdiffstats
path: root/CommonSubexpressionEliminator.cpp
diff options
context:
space:
mode:
authorchriseth <c@ethdev.com>2015-06-06 21:31:22 +0800
committerchriseth <c@ethdev.com>2015-06-06 21:39:14 +0800
commit55e1729852716ccffeada013453e3c40f0edaf28 (patch)
treec6dffb1c5641907876faaf2a9991918cfeeef4f0 /CommonSubexpressionEliminator.cpp
parentcad767de61dc53b9b297f08ee09cb5a3c0821782 (diff)
downloaddexon-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.cpp9
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)