diff options
author | Lefteris Karapetsas <lefteris@refu.co> | 2014-12-16 23:52:47 +0800 |
---|---|---|
committer | Lefteris Karapetsas <lefteris@refu.co> | 2014-12-17 07:03:30 +0800 |
commit | 5c05b8d725f383185ccd3afc700c2c8bac33b16f (patch) | |
tree | 8d71e2a760d364f52ce34ff461020041804816d2 /Compiler.cpp | |
parent | adbea475963ab376c2ae378a03bc58f2fb454b6e (diff) | |
download | dexon-solidity-5c05b8d725f383185ccd3afc700c2c8bac33b16f.tar dexon-solidity-5c05b8d725f383185ccd3afc700c2c8bac33b16f.tar.gz dexon-solidity-5c05b8d725f383185ccd3afc700c2c8bac33b16f.tar.bz2 dexon-solidity-5c05b8d725f383185ccd3afc700c2c8bac33b16f.tar.lz dexon-solidity-5c05b8d725f383185ccd3afc700c2c8bac33b16f.tar.xz dexon-solidity-5c05b8d725f383185ccd3afc700c2c8bac33b16f.tar.zst dexon-solidity-5c05b8d725f383185ccd3afc700c2c8bac33b16f.zip |
Solidity ForStatement Compiler part
- Work in progress
Diffstat (limited to 'Compiler.cpp')
-rw-r--r-- | Compiler.cpp | 31 |
1 files changed, 29 insertions, 2 deletions
diff --git a/Compiler.cpp b/Compiler.cpp index a0cad537..8c70b271 100644 --- a/Compiler.cpp +++ b/Compiler.cpp @@ -289,8 +289,35 @@ bool Compiler::visit(WhileStatement const& _whileStatement) bool Compiler::visit(ForStatement const& _forStatement) { - // LTODO - (void) _forStatement; + eth::AssemblyItem loopStart = m_context.newTag(); + eth::AssemblyItem loopEnd = m_context.newTag(); + m_continueTags.push_back(loopStart); + m_breakTags.push_back(loopEnd); + + if (_forStatement.getInitializationExpression()) + _forStatement.getInitializationExpression()->accept(*this); + + m_context << loopStart; + + // if there is no terminating condition in for, default is to always be true + if (_forStatement.getCondition()) + { + compileExpression(*_forStatement.getCondition()); + m_context << eth::Instruction::ISZERO; + m_context.appendConditionalJumpTo(loopEnd); + } + + _forStatement.getBody().accept(*this); + + // for's loop expression if existing + if (_forStatement.getLoopExpression()) + _forStatement.getLoopExpression()->accept(*this); + + m_context.appendJumpTo(loopStart); + m_context << loopEnd; + + m_continueTags.pop_back(); + m_breakTags.pop_back(); return false; } |