diff options
author | chriseth <chris@ethereum.org> | 2017-05-26 17:24:38 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-05-26 17:24:38 +0800 |
commit | ec676ba9f208d16c1ceb88eda98ff555fa1da7c2 (patch) | |
tree | c50f864332bad1bbcb2577b254310bb21274dd52 /libsolidity/inlineasm/AsmAnalysis.cpp | |
parent | 7126aadab1ecb1eea004c45a7348af2a4d919b36 (diff) | |
parent | 05fcf1989ca619d197d22d3acab79b25ef7aa695 (diff) | |
download | dexon-solidity-ec676ba9f208d16c1ceb88eda98ff555fa1da7c2.tar dexon-solidity-ec676ba9f208d16c1ceb88eda98ff555fa1da7c2.tar.gz dexon-solidity-ec676ba9f208d16c1ceb88eda98ff555fa1da7c2.tar.bz2 dexon-solidity-ec676ba9f208d16c1ceb88eda98ff555fa1da7c2.tar.lz dexon-solidity-ec676ba9f208d16c1ceb88eda98ff555fa1da7c2.tar.xz dexon-solidity-ec676ba9f208d16c1ceb88eda98ff555fa1da7c2.tar.zst dexon-solidity-ec676ba9f208d16c1ceb88eda98ff555fa1da7c2.zip |
Merge pull request #2224 from ethereum/julia-switch
Implement switch statement in the assembly parser/printer
Diffstat (limited to 'libsolidity/inlineasm/AsmAnalysis.cpp')
-rw-r--r-- | libsolidity/inlineasm/AsmAnalysis.cpp | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/libsolidity/inlineasm/AsmAnalysis.cpp b/libsolidity/inlineasm/AsmAnalysis.cpp index 65b935f2..d022ecf6 100644 --- a/libsolidity/inlineasm/AsmAnalysis.cpp +++ b/libsolidity/inlineasm/AsmAnalysis.cpp @@ -285,6 +285,48 @@ bool AsmAnalyzer::operator()(assembly::FunctionCall const& _funCall) return success; } +bool AsmAnalyzer::operator()(Switch const& _switch) +{ + bool success = true; + + int const initialStackHeight = m_stackHeight; + if (!boost::apply_visitor(*this, *_switch.expression)) + success = false; + expectDeposit(1, initialStackHeight, locationOf(*_switch.expression)); + + set<tuple<LiteralKind, string>> cases; + for (auto const& _case: _switch.cases) + { + if (_case.value) + { + int const initialStackHeight = m_stackHeight; + if (!(*this)(*_case.value)) + success = false; + expectDeposit(1, initialStackHeight, _case.value->location); + m_stackHeight--; + + /// Note: the parser ensures there is only one default case + auto val = make_tuple(_case.value->kind, _case.value->value); + if (!cases.insert(val).second) + { + m_errors.push_back(make_shared<Error>( + Error::Type::DeclarationError, + "Duplicate case defined", + _case.location + )); + success = false; + } + } + + if (!(*this)(_case.body)) + success = false; + } + + m_stackHeight--; + + return success; +} + bool AsmAnalyzer::operator()(Block const& _block) { bool success = true; |