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 | |
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
-rw-r--r-- | AST.h | 5 | ||||
-rw-r--r-- | Compiler.cpp | 31 |
2 files changed, 34 insertions, 2 deletions
@@ -529,6 +529,11 @@ public: virtual void accept(ASTConstVisitor& _visitor) const override; virtual void checkTypeRequirements() override; + Statement const* getInitializationExpression() const { return m_initExpression.get(); } + Expression const* getCondition() const { return m_condExpression.get(); } + ExpressionStatement const* getLoopExpression() const { return m_loopExpression.get(); } + Statement const& getBody() const { return *m_body; } + private: /// For statement's initialization expresion. for(XXX; ; ). Can be empty ASTPointer<Statement> m_initExpression; 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; } |