aboutsummaryrefslogtreecommitdiffstats
path: root/Compiler.cpp
diff options
context:
space:
mode:
authorLefteris Karapetsas <lefteris@refu.co>2014-12-16 23:52:47 +0800
committerLefteris Karapetsas <lefteris@refu.co>2014-12-17 07:03:30 +0800
commit5c05b8d725f383185ccd3afc700c2c8bac33b16f (patch)
tree8d71e2a760d364f52ce34ff461020041804816d2 /Compiler.cpp
parentadbea475963ab376c2ae378a03bc58f2fb454b6e (diff)
downloaddexon-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.cpp31
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;
}