aboutsummaryrefslogtreecommitdiffstats
path: root/libyul/optimiser/VarDeclInitializer.cpp
diff options
context:
space:
mode:
authorchriseth <chris@ethereum.org>2018-12-20 01:06:13 +0800
committerGitHub <noreply@github.com>2018-12-20 01:06:13 +0800
commit1df8f40cd2fd7b47698d847907b8ca7b47eb488d (patch)
tree5ed5816fe2d1a8a207e750d39884aca7957c8289 /libyul/optimiser/VarDeclInitializer.cpp
parentc8a2cb62832afb2dc09ccee6fd42c1516dfdb981 (diff)
parentddf54b21d1d002903624f61173ab4af197f50053 (diff)
downloaddexon-solidity-1df8f40cd2fd7b47698d847907b8ca7b47eb488d.tar
dexon-solidity-1df8f40cd2fd7b47698d847907b8ca7b47eb488d.tar.gz
dexon-solidity-1df8f40cd2fd7b47698d847907b8ca7b47eb488d.tar.bz2
dexon-solidity-1df8f40cd2fd7b47698d847907b8ca7b47eb488d.tar.lz
dexon-solidity-1df8f40cd2fd7b47698d847907b8ca7b47eb488d.tar.xz
dexon-solidity-1df8f40cd2fd7b47698d847907b8ca7b47eb488d.tar.zst
dexon-solidity-1df8f40cd2fd7b47698d847907b8ca7b47eb488d.zip
Merge pull request #5697 from ethereum/develop
Merge develop into release for 0.5.2
Diffstat (limited to 'libyul/optimiser/VarDeclInitializer.cpp')
-rw-r--r--libyul/optimiser/VarDeclInitializer.cpp56
1 files changed, 56 insertions, 0 deletions
diff --git a/libyul/optimiser/VarDeclInitializer.cpp b/libyul/optimiser/VarDeclInitializer.cpp
new file mode 100644
index 00000000..4a26757f
--- /dev/null
+++ b/libyul/optimiser/VarDeclInitializer.cpp
@@ -0,0 +1,56 @@
+/*
+ This file is part of solidity.
+
+ solidity is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ solidity is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with solidity. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <libyul/optimiser/VarDeclInitializer.h>
+#include <libyul/AsmData.h>
+
+#include <libdevcore/CommonData.h>
+#include <libdevcore/Visitor.h>
+
+using namespace std;
+using namespace dev;
+using namespace yul;
+
+void VarDeclInitializer::operator()(Block& _block)
+{
+ ASTModifier::operator()(_block);
+
+ static Expression const zero{Literal{{}, LiteralKind::Number, YulString{"0"}, {}}};
+
+ using OptionalStatements = boost::optional<vector<Statement>>;
+ GenericFallbackReturnsVisitor<OptionalStatements, VariableDeclaration> visitor{
+ [](VariableDeclaration& _varDecl) -> OptionalStatements
+ {
+ if (_varDecl.value)
+ return {};
+ else if (_varDecl.variables.size() == 1)
+ {
+ _varDecl.value = make_shared<Expression>(zero);
+ return {};
+ }
+ else
+ {
+ OptionalStatements ret{vector<Statement>{}};
+ langutil::SourceLocation loc{std::move(_varDecl.location)};
+ for (auto& var: _varDecl.variables)
+ ret->push_back(VariableDeclaration{loc, {std::move(var)}, make_shared<Expression>(zero)});
+ return ret;
+ }
+ }
+ };
+ iterateReplacing(_block.statements, boost::apply_visitor(visitor));
+}