diff options
author | chriseth <chris@ethereum.org> | 2017-06-07 17:40:47 +0800 |
---|---|---|
committer | chriseth <chris@ethereum.org> | 2017-06-08 21:52:45 +0800 |
commit | b32d5e4cc011e91efb2e8399c692206bfeaf9ca3 (patch) | |
tree | 5397bce29d7901b951d5aff79649cc163e6c4c56 /libsolidity/inlineasm/AsmAnalysis.cpp | |
parent | 893e6f4ec2dff8aeca4fa3b99a265f291428deac (diff) | |
download | dexon-solidity-b32d5e4cc011e91efb2e8399c692206bfeaf9ca3.tar.gz dexon-solidity-b32d5e4cc011e91efb2e8399c692206bfeaf9ca3.tar.zst dexon-solidity-b32d5e4cc011e91efb2e8399c692206bfeaf9ca3.zip |
Visitor bugfix.
Diffstat (limited to 'libsolidity/inlineasm/AsmAnalysis.cpp')
-rw-r--r-- | libsolidity/inlineasm/AsmAnalysis.cpp | 23 |
1 files changed, 17 insertions, 6 deletions
diff --git a/libsolidity/inlineasm/AsmAnalysis.cpp b/libsolidity/inlineasm/AsmAnalysis.cpp index bfc6b2af..13852880 100644 --- a/libsolidity/inlineasm/AsmAnalysis.cpp +++ b/libsolidity/inlineasm/AsmAnalysis.cpp @@ -277,8 +277,12 @@ bool AsmAnalyzer::operator()(Switch const& _switch) { if (_case.value) { - if (!expectExpression(*_case.value)) + int const initialStackHeight = m_stackHeight; + // We cannot use "expectExpression" here because *_case.value is not a + // Statement and would be converted to a Statement otherwise. + if (!(*this)(*_case.value)) success = false; + expectDeposit(1, initialStackHeight, _case.value->location); m_stackHeight--; /// Note: the parser ensures there is only one default case @@ -345,17 +349,24 @@ bool AsmAnalyzer::expectExpression(Statement const& _statement) int const initialHeight = m_stackHeight; if (!boost::apply_visitor(*this, _statement)) success = false; - if (m_stackHeight - initialHeight != 1) + if (!expectDeposit(1, initialHeight, locationOf(_statement))) + success = false; + return success; +} + +bool AsmAnalyzer::expectDeposit(int _deposit, int _oldHeight, SourceLocation const& _location) +{ + if (m_stackHeight - _oldHeight != _deposit) { m_errorReporter.typeError( - locationOf(_statement), + _location, "Expected expression to return one item to the stack, but did return " + - boost::lexical_cast<string>(m_stackHeight - initialHeight) + + boost::lexical_cast<string>(m_stackHeight - _oldHeight) + " items." ); - success = false; + return false; } - return success; + return true; } bool AsmAnalyzer::checkAssignment(assembly::Identifier const& _variable, size_t _valueSize) |