From b5080860d5f2d141b8fccceaa635378a86c996a8 Mon Sep 17 00:00:00 2001 From: Alex Beregszaszi Date: Fri, 28 Apr 2017 14:27:56 +0100 Subject: Implement switch statement in the assembly parser/printer --- libsolidity/inlineasm/AsmAnalysis.cpp | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) (limited to 'libsolidity/inlineasm/AsmAnalysis.cpp') diff --git a/libsolidity/inlineasm/AsmAnalysis.cpp b/libsolidity/inlineasm/AsmAnalysis.cpp index 65b935f2..ecc63372 100644 --- a/libsolidity/inlineasm/AsmAnalysis.cpp +++ b/libsolidity/inlineasm/AsmAnalysis.cpp @@ -285,6 +285,38 @@ bool AsmAnalyzer::operator()(assembly::FunctionCall const& _funCall) return success; } +bool AsmAnalyzer::operator()(Switch const& _switch) +{ + int const initialStackHeight = m_stackHeight; + if (!boost::apply_visitor(*this, *_switch.expression)) + return false; + expectDeposit(1, initialStackHeight, locationOf(*_switch.expression)); + + map caseNames; + for (auto const& _case: _switch.cases) + { + /// Note: the parser ensures there is only one default case + if (caseNames[_case.name]) + { + m_errors.push_back(make_shared( + Error::Type::DeclarationError, + "Duplicate case defined: " + _case.name, + _case.location + )); + return false; + } + else + caseNames[_case.name] = true; + + if (!(*this)(_case.body)) + return false; + } + + m_stackHeight--; + + return true; +} + bool AsmAnalyzer::operator()(Block const& _block) { bool success = true; -- cgit v1.2.3 From 66eab1caf63f9221a279abf71de953524fe9c2ad Mon Sep 17 00:00:00 2001 From: Alex Beregszaszi Date: Wed, 17 May 2017 11:21:37 +0100 Subject: Change switch case string to Literal --- libsolidity/inlineasm/AsmAnalysis.cpp | 30 +++++++++++++++++++----------- 1 file changed, 19 insertions(+), 11 deletions(-) (limited to 'libsolidity/inlineasm/AsmAnalysis.cpp') diff --git a/libsolidity/inlineasm/AsmAnalysis.cpp b/libsolidity/inlineasm/AsmAnalysis.cpp index ecc63372..a83a93a8 100644 --- a/libsolidity/inlineasm/AsmAnalysis.cpp +++ b/libsolidity/inlineasm/AsmAnalysis.cpp @@ -292,21 +292,29 @@ bool AsmAnalyzer::operator()(Switch const& _switch) return false; expectDeposit(1, initialStackHeight, locationOf(*_switch.expression)); - map caseNames; + set> cases; for (auto const& _case: _switch.cases) { - /// Note: the parser ensures there is only one default case - if (caseNames[_case.name]) + if (_case.value) { - m_errors.push_back(make_shared( - Error::Type::DeclarationError, - "Duplicate case defined: " + _case.name, - _case.location - )); - return false; + int const initialStackHeight = m_stackHeight; + if (!(*this)(*_case.value)) + return 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::Type::DeclarationError, + "Duplicate case defined", + _case.location + )); + return false; + } } - else - caseNames[_case.name] = true; if (!(*this)(_case.body)) return false; -- cgit v1.2.3 From ba8a79c600e45618a5cd0bbfc044edbeab1e551c Mon Sep 17 00:00:00 2001 From: Alex Beregszaszi Date: Fri, 19 May 2017 18:33:25 +0100 Subject: Do not stop on first switch error --- libsolidity/inlineasm/AsmAnalysis.cpp | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) (limited to 'libsolidity/inlineasm/AsmAnalysis.cpp') diff --git a/libsolidity/inlineasm/AsmAnalysis.cpp b/libsolidity/inlineasm/AsmAnalysis.cpp index a83a93a8..d022ecf6 100644 --- a/libsolidity/inlineasm/AsmAnalysis.cpp +++ b/libsolidity/inlineasm/AsmAnalysis.cpp @@ -287,9 +287,11 @@ bool AsmAnalyzer::operator()(assembly::FunctionCall const& _funCall) bool AsmAnalyzer::operator()(Switch const& _switch) { + bool success = true; + int const initialStackHeight = m_stackHeight; if (!boost::apply_visitor(*this, *_switch.expression)) - return false; + success = false; expectDeposit(1, initialStackHeight, locationOf(*_switch.expression)); set> cases; @@ -299,7 +301,7 @@ bool AsmAnalyzer::operator()(Switch const& _switch) { int const initialStackHeight = m_stackHeight; if (!(*this)(*_case.value)) - return false; + success = false; expectDeposit(1, initialStackHeight, _case.value->location); m_stackHeight--; @@ -312,17 +314,17 @@ bool AsmAnalyzer::operator()(Switch const& _switch) "Duplicate case defined", _case.location )); - return false; + success = false; } } if (!(*this)(_case.body)) - return false; + success = false; } m_stackHeight--; - return true; + return success; } bool AsmAnalyzer::operator()(Block const& _block) -- cgit v1.2.3