aboutsummaryrefslogtreecommitdiffstats
path: root/libsolidity/codegen/ContractCompiler.cpp
diff options
context:
space:
mode:
authorchriseth <chris@ethereum.org>2016-11-11 00:13:45 +0800
committerGitHub <noreply@github.com>2016-11-11 00:13:45 +0800
commita40dcfef1257c4b159eb8248ecb0f837b42d8ead (patch)
tree0d50154179583e9f2e6d7588c22f88cade14717c /libsolidity/codegen/ContractCompiler.cpp
parent81118de51273a5aef711b321f20ee02da9e55533 (diff)
parent4524ad08701939cc22d28494c57dda1cdfba9e10 (diff)
downloaddexon-solidity-a40dcfef1257c4b159eb8248ecb0f837b42d8ead.tar
dexon-solidity-a40dcfef1257c4b159eb8248ecb0f837b42d8ead.tar.gz
dexon-solidity-a40dcfef1257c4b159eb8248ecb0f837b42d8ead.tar.bz2
dexon-solidity-a40dcfef1257c4b159eb8248ecb0f837b42d8ead.tar.lz
dexon-solidity-a40dcfef1257c4b159eb8248ecb0f837b42d8ead.tar.xz
dexon-solidity-a40dcfef1257c4b159eb8248ecb0f837b42d8ead.tar.zst
dexon-solidity-a40dcfef1257c4b159eb8248ecb0f837b42d8ead.zip
Merge pull request #768 from roadriverrail/do_while_loops
Add support for do/while loops
Diffstat (limited to 'libsolidity/codegen/ContractCompiler.cpp')
-rw-r--r--libsolidity/codegen/ContractCompiler.cpp19
1 files changed, 16 insertions, 3 deletions
diff --git a/libsolidity/codegen/ContractCompiler.cpp b/libsolidity/codegen/ContractCompiler.cpp
index ebb84784..1404963f 100644
--- a/libsolidity/codegen/ContractCompiler.cpp
+++ b/libsolidity/codegen/ContractCompiler.cpp
@@ -611,12 +611,25 @@ bool ContractCompiler::visit(WhileStatement const& _whileStatement)
m_breakTags.push_back(loopEnd);
m_context << loopStart;
- compileExpression(_whileStatement.condition());
- m_context << Instruction::ISZERO;
- m_context.appendConditionalJumpTo(loopEnd);
+
+ // While loops have the condition prepended
+ if (!_whileStatement.isDoWhile())
+ {
+ compileExpression(_whileStatement.condition());
+ m_context << Instruction::ISZERO;
+ m_context.appendConditionalJumpTo(loopEnd);
+ }
_whileStatement.body().accept(*this);
+ // Do-while loops have the condition appended
+ if (_whileStatement.isDoWhile())
+ {
+ compileExpression(_whileStatement.condition());
+ m_context << Instruction::ISZERO;
+ m_context.appendConditionalJumpTo(loopEnd);
+ }
+
m_context.appendJumpTo(loopStart);
m_context << loopEnd;