aboutsummaryrefslogtreecommitdiffstats
path: root/libsolidity/inlineasm/AsmAnalysis.cpp
diff options
context:
space:
mode:
authorchriseth <chris@ethereum.org>2017-05-26 17:24:38 +0800
committerGitHub <noreply@github.com>2017-05-26 17:24:38 +0800
commitec676ba9f208d16c1ceb88eda98ff555fa1da7c2 (patch)
treec50f864332bad1bbcb2577b254310bb21274dd52 /libsolidity/inlineasm/AsmAnalysis.cpp
parent7126aadab1ecb1eea004c45a7348af2a4d919b36 (diff)
parent05fcf1989ca619d197d22d3acab79b25ef7aa695 (diff)
downloaddexon-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.cpp42
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;