diff options
author | chriseth <chris@ethereum.org> | 2016-11-11 00:13:45 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2016-11-11 00:13:45 +0800 |
commit | a40dcfef1257c4b159eb8248ecb0f837b42d8ead (patch) | |
tree | 0d50154179583e9f2e6d7588c22f88cade14717c /libsolidity/codegen/ContractCompiler.cpp | |
parent | 81118de51273a5aef711b321f20ee02da9e55533 (diff) | |
parent | 4524ad08701939cc22d28494c57dda1cdfba9e10 (diff) | |
download | dexon-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.cpp | 19 |
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; |